2016-09-01 4 views
0

Ich versuche, für Wert von Klasse B zu nennen, die in der Klasse A verschachtelt ist und verwenden Sie es in der Klasse C. Ich erhalte Attribute:Python: für Wert innerhalb verschachtelte Klasse aufrufen

class A(): 
    class B(): 
     a = 1 
    class C(): 
     b = 2 
     c = B.a + b 
AttributeError: class B has no attribute 'a' 

I auch versucht, von ‚A‘ zu nennen, PyCharm es erkennen, aber python noch Attribute erhalten:

class A(object): 
    class B(object): 
     a = 1 
    class C(object): 
     b = 2 
     c = A.B.a + b 
AttributeError: class A has no attribute 'B' 

Hat eine Idee von jemand hat, wie es zu benutzen? Danke

Antwort

1

Das Problem ist, dass die Klassenvorlage (A) nicht erstellt wird, während Sie A.B.a aufrufen. Das heißt, A ist noch nicht an eine Klasse gebunden.

Versuchen Sie diese Abhilfe:

class A(): 
    class B(): 
     a = 1 

Jetzt C separat erstellen (A bereits definiert ist):

class C(): 
    b = 2 
    c = A.B.a + b 

und Referenz C von A:

A.C = C 

Dies vielleicht sein kann getan über Meta-cla Sse, aber könnte hier eine Übertötung sein.

+0

Ich versuche, eine eigene Klasse zu vermeiden erstellen, ich versuche, um die Bildung von verschachtelten Klassen zu bleiben. – Nikigv

0

Zum Zeitpunkt der Kompilierung ist die Klassendefinition für Klasse A nicht vollständig. Daher können Sie nicht auf die in einer übergeordneten Klasse in einer verschachtelten Klasse definierten Klassen, Variablen und Methoden zugreifen.

Sie können versuchen, die Klassendefinitionen zu trennen, wie von @Reut Sharabani vorgeschlagen.

0

Sie können nicht auf die Klasse über ihren Namen zugreifen, während die Klassendefinitionsanweisung noch ausgeführt wird.

class A(object): 
    class B(object): 
     a = 1 
    class C(object): 
     b = 2 
     c = A.B.a + b # here class A statement is still executed, there is no A class yet 

das Problem lösen Sie die Ausführung dieser Anweisungen verschieben müssen:

  • bewegen die alle Aussagen zu einem ihnen classmethod
  • nennen, nachdem die Klassen definiert wurde.

class A(object): 
    class B(object): 
     @classmethod 
     def init(cls): 
      cls.a = 1 
    class C(object): 
     @classmethod 
     def init(cls): 
      cls.b = 2 
      cls.c = A.B.a + cls.b 

    @classmethod 
    def init(cls): 
     cls.B.init() 
     cls.C.init() 

A.init() 
Verwandte Themen