2017-08-22 11 views
4

Sagen wir, ich habe zwei Klassen in zwei Dateien:Kreis Importe in Klassen

from Son import Son 
class Mother: 
    def __init__(self): 
     self.sons = [] 
    def add_son(self, son: Son): 
     self.sons.append(son) 

und

from Mother import Mother 
class Son: 
    def __init__(self, mother: Mother): 
     self.mother = mother 
     mother.add_son(self) 

Plus eine Hauptdatei

from Mother import Mother 
from Son import Son 
if __name__ == '__main__': 
    mother = Mother() 
    son1 = Son(mother) 
    son2 = Son(mother) 

Offensichtlich habe ich eine zirkuläre Abhängigkeit . Wie geht man mit dieser Art von Verhalten um, ohne den Typhinweis zu verlieren?

+0

Artikel auf [zirkuläre Importe] (http://effbot.org/zone/import-confusion.htm#circular-imports) hier, die helfen können. Zwei Lösungen sind Code zu reformieren oder eine Importanweisung zum Ende des Moduls zu verschieben. –

Antwort

4

Ihre einzige zirkuläre Abhängigkeit ist in den Typ Hinweise, und die können als Strings angegeben werden:

# Mother.py 
class Mother: 
    def __init__(self): 
     self.sons = [] 
    def add_son(self, son: 'Son.Son'): 
     self.sons.append(son) 

# Son.py 
class Son: 
    def __init__(self, mother: 'Mother.Mother'): 
     self.mother = mother 
     mother.add_son(self) 

Sie noch import Mother und import Son müssen; Ich bin mir nicht sicher, ob die aktuellen Analysewerkzeuge intelligent genug sind, um die Typhinweise anders zu lösen. Nicht verwenden from Importe; Diese erzwingen die Auflösung des Modulinhalts zum Zeitpunkt des Imports.

+0

Vielen Dank für Ihre Antwort. Ich habe immer noch ein paar Verhöre. Stellen wir uns vor, dass ich anstelle von Tipptipps Mutter importieren muss, um ein neues zu erstellen. Hätte ich keine andere Wahl als Refactoring? Auch, bedeutet "nicht von Importen verwenden" niemals oder vermeiden? Denn bei komplexen Paketen kann das Verweisen auf Dinge ziemlich unübersichtlich werden, oder? – Vanesbush

+1

@Vanesbush: Benutze 'from' Importe * hier nicht *. Wenn Sie "Mutter" importieren müssen, um eine neue Instanz zu erstellen, verwenden Sie keinen "von" Import. Solange Sie "Mother.Mother" nur dann auflösen, wenn es tatsächlich definiert wurde, sollten Sie keine Fehler entdecken, aber Sie möchten dennoch einen Refactoring durchführen. – user2357112

+0

Ich bekomme es, danke! – Vanesbush

Verwandte Themen