2017-02-12 24 views
0

内部クラスを別の内部クラスから参照しようとしています。私は両方を試してみました。それぞれの結果とPython - 他の内部クラスの内部クラスを参照

class Foo(object): 

    class A(object): 
    pass 

    class B(object): 
    other = A 

class Foo(object): 

    class A(object): 
    pass 

    class B(object): 
    other = Foo.A 

Traceback (most recent call last): 
    File "python", line 1, in <module> 
    File "python", line 6, in Foo 
    File "python", line 7, in B 
NameError: name 'A' is not defined 

Traceback (most recent call last): 
    File "python", line 1, in <module> 
    File "python", line 6, in Foo 
    File "python", line 7, in B 
NameError: name 'Foo' is not defined 

が可能、このですか?

+1

あなたの試みからはっきりと答えはノーですが、最終的にここで何をしようとしていますか? **どの問題を解決しようとしていますか?** –

+0

なぜあなたは入れ子にされたクラスを持っていますか? Pythonでは非常に便利なものではありません。 –

+0

クラスを使用していても、解決しようとしている問題には必ずしも適しているとは限りません。 –

答えて

0

@staticmethodでメソッドを定義しない限り、あるクラスで定義したすべてのものがそのクラスのインスタンスでのみ有効なメンバーになるため、このようなプロパティはありません。

だから、これはどちらか動作しません。

class Foo(object): 
    x = 10 

    class A(object): 
     pass 

    class B(object): 
     other = x 

この動作しますが、それはあなたが意図したものではありません。

class Foo(object): 
    x = 10 

    class A(object): 
    pass 

    class B(object): 
    def __init__(self): 
     self.other = Foo.A 

f = Foo() 
print(f.B().other) 

出力は次のとおりです。

<class '__main__.Foo.A'> 

この理由は、メソッド(この場合は__init__)は、オブジェクトの作成時に評価され、__init__より前の割り当ては、クラスが読み込まれ、解釈されている間に評価されます。

モジュール内のすべてのクラスを独自に定義するだけで、ほぼ同じことができます。モジュールをインポートすると、そのクラス内で定義したクラスのフィールドを持つオブジェクトになります。

+0

「私はなぜPythonでそれをしますか?」から私を救ってくれてありがとう。私の理解を助ける。 –

+0

はい、残念ながら、あなたのソリューションは私の "クラスB"では動作しません。クラスBには、Bクラスの変数を処理するメタクラスロジックがあります。 はい、私はクラスを再編成することができました(彼らはとにかく同じモジュールにあります)。私は内部クラスに固有の名前空間を活用しようとしていました。 –

関連する問題