2012-04-05 14 views
4

Possible Duplicate:
Circular (or cyclic) imports in PythonResolve Kreisimportfehler in Python

I Klasse B haben, die importiert und Instanzen der Klasse A. schafft Class A Bezugnahme in ihrer contructor nach B braucht und so schließt B.

from a import A 
class B: 
    def __init__(self): 
    self.a = A() 

from b import B 
class A: 
    def __init__(self, ref): 
    assert isinstance(ref, B) 
    self.ref = ref 

Dies funktioniert nicht. Die Hauptdatei importiert B und verwendet sie ... nicht. Etwas mit den Importen ist falsch.

Fehler aus der Datei ein Import: nicht Name B

+0

Nein, das nicht funktioniert. Also tu das nicht. –

+0

Keine Antwort, aber es ist wahrscheinlich am besten, ein besseres Design zu haben, das diesen zirkulären Import nicht benötigt. – jamylak

+0

Verstanden. Aber das scheint ein grundlegendes Problem zu sein. Klasse braucht einen Verweis auf die obere Ebene ... – HWende

Antwort

11

Neben „importieren nicht das tun, können Sie sich in eine Ecke malen "Sie können den Import von B auch aufschieben, bis Sie ihn benötigen. Datei a.py:

class A: 
    def __init__(self, ref): 
     from b import B 
     assert isinstance(ref, B) 
     self.ref = ref 

Klasse B werden nicht importiert, bis Klasse instanziiert A, in welcher Zeit das Modul bereits vollständig b durch das Modul importiert wurde.

Sie können auch eine gemeinsame Basisklasse verwenden und dafür testen.

+0

Danke, ich werde damit gehen. Ich habe diese Idee irgendwo gesehen, konnte sie aber nicht verstehen. Ihre zusätzliche Erklärung ist ausgezeichnet! – HWende

1

Nur Import-Klassen in __init__ Methode

class A: 
    def __init__(self, ref): 
     from b import B 
     assert isinstance(ref, B) 
     self.ref = ref 
0

Die Methode __init__ wird ausgeführt, wenn Sie eine Instanz der Klasse erstellen. In diesem Fall sollten Sie es durch einfaches Ändern der Einfuhr Aussagen wie dies funktioniert:

import a 
class B: 
    def __init__(self): 
    self.a = a.A(self) 

import b 
class A: 
    def __init__(self, ref): 
    assert isinstance(ref, b.B) 
    self.ref = ref