das folgende Beispiel 1 läuft ohne Probleme...
Code: Alles auswählen
class A1(object):
pass
class B1(object):
a = A1()
Code: Alles auswählen
class X(object):
class A2(object):
pass
class B2(object):
a = A2()
Bsp. 1 funktioniert, weil auf Modulebene unmittelbar nach Ausführen der ersten Klassendef. der Name A1 an die Klasse gebunden wird und damit global ist, also inbesondere in der Def. von B1 darauf zugegriffen werden kann. Bsp. 2 funktioniert nicht, weil beim Ausführen der Klassendef. von B2 die Klasse A2 zwar existiert, der Name A2 aber nur in einem dict steht, das später mal zu X.__dict__ wird.
(Wenn diese Erklärungen nicht stimmen, lasse ich mich gerne eines Besseren belehren...)
Meine Frage dazu: Gibt es überhaupt eine Möglichkeit, in B2 auf A2 zuzugreifen? Ich meine nicht mittels X.A2 in irgendwelchen Methoden von B2, sondern im Code, der zur Konstruktion von B2 ausgeführt wird, wenn X noch gar nicht existiert. "Irgendwie" steht der Name A2 schon zur Verfügung; der folgende Code...
Code: Alles auswählen
class X(object):
class A2(object):
pass
class B2(A2):
pass
In Bsp. 2 sehe ich nur die Möglichkeit, die Klasse A2 an einen globalen Namen zu binden oder sonst explizit einen Zugriff zu schaffen.
Das Ganze ist sicherlich ein ausgefalles Beispiel, und normalerweise bin ich kein Freund von "lokalen" Klassen. In meiner Anwendung ist X von unittest.TestCase abgeleitet, und A2 und B2 sind nur für die Tests in X relevant. Deshalb fände ich es hier konsequent, A2 und B2 im Namespace von X abzulegen.
Viele Grüße
pcos