Zirkuläre Importe in Python mit unveränderlichen und veränderlichen Klassen vermeiden
Zirkuläre Importe werden normalerweise als Symptom für schlechtes Codedesign angesehen. In bestimmten Szenarien können jedoch zirkuläre Abhängigkeiten zwischen Klassen erforderlich sein. Um in solchen Fällen Importfehler zu vermeiden, müssen die Importanweisungen und die Platzierung von Zirkelverweisen sorgfältig verwaltet werden.
Beispielszenario
Betrachten Sie zwei Klassen, A und B, wobei A ein veränderliches Attribut (eine Liste) und B ein unveränderliches Attribut (ein Tupel) hat. Jede Klasse benötigt eine Methode, die eine Instanz der anderen Klasse nimmt und eine Instanz von sich selbst zurückgibt und die Attribute entsprechend transformiert.
Lösungen
Es gibt mehrere Ansätze, die es zu vermeiden gilt Zirkuläre Importe in diesem Szenario:
Absolute Importe:
Verwenden Sie in a.py und b.py absolute Importe, um sicherzustellen, dass die Module sich gegenseitig direkt importieren können:
# a.py from package import b # b.py from package import a
Import zurückstellen:
Importieren der anderen Klasse verzögern, bis sie tatsächlich innerhalb einer Funktion benötigt wird:
# a.py def convert_to_list(b_obj): from package import b return a.A(list(b_obj.immutable_attr)) # b.py def convert_to_tuple(a_obj): from package import a return b.B(tuple(a_obj.mutable_attr))
Mittelstufe Modul:
Erstellen Sie ein Zwischenmodul, das sowohl a als auch b importiert. Dieses Modul kann dann sowohl von a als auch von b importiert werden, um zirkuläre Importe zu vermeiden:
# package/common.py import a import b
In a.py und b.py importieren Sie das Zwischenmodul:
# a.py from package import common # b.py from package import common
Zirkelverweise in Klassendefinitionen vermeiden:
Zirkelverweise in Klassendefinitionen sollten vermieden werden. Erwägen Sie stattdessen die Erstellung einer Factory-Funktion, die die Attribute der Klasse als Argumente verwendet und eine Instanz der entsprechenden Klasse zurückgibt:
# a.py def create_a(list_attr): return A(list(list_attr)) # b.py def create_b(tuple_attr): return B(tuple(tuple_attr))
Das obige ist der detaillierte Inhalt vonWie gehe ich mit zirkulären Importen in Python mit unveränderlichen und veränderlichen Klassen um?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!