Forward-Deklaration von Klassen in Python
-
12-10-2019 - |
Frage
Das folgende Programm kann erfolgreich ausgeführt werden:
class Simple(object):
def __init__(self, name):
self.name = name
def __add__(self, other):
c = Composite()
c._members.append(self)
c._members.append(other)
return c
def __repr__(self):
return "Simple('%s')" % self.name
class Composite(object):
def __init__(self):
self._members = []
def __add__(self, obj):
if isinstance(obj, Simple):
out = Composite()
out._members = [k for k in self._members] + [obj]
elif isinstance(obj, Composite):
out = Composite()
out._members = [k for k in self._members + obj._members]
else:
raise TypeError
return out
if __name__ == "__main__":
s1 = Simple('one')
s2 = Simple('two')
s3 = Simple('three')
c1 = s1 + s2
c2 = c1 + s3
print c1._members
print c2._members
# output:
# [Simple('one'), Simple('two')]
# [Simple('one'), Simple('two'), Simple('three')]
Ich mochte die Definition von Simple
halten, Composite
und __main__
in drei verschiedenen Dateien, aber ich kann es nicht tun, weil ich kann nicht importieren Simple
in composite.py
und ich kann nicht importieren Composite
in simple.py
.
Wie würden Sie die Klassendefinition ändern, dass Sie einzelne Dateien behalten können?
Danke.
PS. Ich habe mehrere Antworten zu lesen „forward-Deklaration“ im Zusammenhang konnte aber keine Antwort auf mein spezielles Problem finden.
Lösung
Da keine der Referenzen benötigt werden, bis die Verfahren genannt werden, Kreis Importe können Arbeit hier. Der Trick ist, vollständig qualifizierte Referenzen zu verwenden.
import composite
class Simple(object):
...
def __add__(self, other):
c = composite.Composite()
c._members.append(self)
c._members.append(other)
return c
Andere Tipps
Das Problem ist, dass Sie Kreis Importe, nicht wahr?
Import Einfach in der __add__
Methode anstatt am Anfang der Datei zirkuläre Abhängigkeit zu vermeiden. Es wird die __add__
Methode etwas verlangsamen, aber in der Regel nicht wesentlich.