2016-08-22 9 views
0

この...Pythonの内部クラスを、それ自身の外部クラスのサブクラスにすることはできますか? ": '' 定義されていない名前NameErrorを"

class A(object): 
    class B(A): 
     def __init__(self): 
      pass 

...スローします。

これを達成するための適切な構文があり、または私はこのように、回避策を使用する必要がありますか?

class A(object): 
    pass 
class _B(A): 
    pass 
A.B = _B 

これが強く推奨されます。ありがとうございました。答えとして投稿のOPS要求ごととして

+7

1のような奇妙な何かを行うことができますそれはサブクラスではなく内部クラスです。 2.いいえ、内部クラスは、内部クラスを定義しながら、外側のクラスが完全に定義されていないため、その外側のクラス(延びていない)を継承することができません。それは内部クラスを持っていないよう 3.あなたの問題を回避するには、周りの仕事ではありません。あなたは、サブクラスと内部クラスを混同しています。 – DeepSpace

+0

Pythonでは、内部クラスの良いユースケースはほとんどありません。 –

+0

それから私はクエリに誤った名前をつけました。したがって、これは内部クラスでは不可能です。この名前を変更することは可能ですか、または質問は無効ですか? – ca2longoria

答えて

1

、。

  1. これはサブクラスではなく、内部クラスです。

  2. なし、内部クラスは、内部クラスを定義しながら、外側のクラスが完全に定義されていないため、その外側のクラス(延びていない)を継承することができません。それは内部クラスを持っていないよう

  3. あなたの問題を回避するには、周りの仕事ではありません。

1

あなたはこれを通常の方法で行うことはできませんし、おそらくこれを行うべきではありません。

同様の試みを正当な理由がある人は、Aが完全に定義された後にA.Bのスーパークラスを動的に変更することで回避策があります(https://stackoverflow.com/a/9639512/5069869参照)。

これはおそらくひどいコード、大きなハックして行われるべきではありませんが、それは一定の条件の下で動作します(リンクの答えを参照)

class T: pass 
class A(object): 
    def a(self): 
    return "Hallo a" 
    class B(T): 
    def b(self): 
     return "Hallo b" 
A.B.__bases__ = (A,) 
b=A.B() 
assert isinstance(b, A) 
assert b.a()=="Hallo a" 

今すぐあなたもx = A.B.B.B.B()

+0

ああ、良い主人...しかし、実際の例をありがとう。これを実現するためには、どのように後ろ向きに動かなければならないかを明確にしています。クラス構造に違ったアプローチをします。 – ca2longoria

+1

誰かがこれをしているなら、私は彼らに幸運のデバッグをして欲しい:) – DeepSpace

関連する問題