dichiarazione anticipata di classi in Python
-
12-10-2019 - |
Domanda
Il seguente programma può essere eseguito con successo:
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')]
Vorrei mantenere la definizione di Simple
, Composite
, e __main__
in tre file differenti, ma non posso farlo perché non posso importare Simple
in composite.py
e non posso Composite
importazione in simple.py
.
Come vi modificare la definizione di classe in modo tale che è possibile mantenere file separati?
Grazie.
PS. Ho letto diverse risposte correlate a "dichiarazione anticipata", ma non sono riuscito a trovare una risposta al mio problema specifico.
Soluzione
Dal momento che nessuno dei riferimenti sono necessari fino a quando i metodi vengono chiamati, le importazioni circolari possono lavoro qui. Il trucco è quello di utilizzare i riferimenti completo.
import composite
class Simple(object):
...
def __add__(self, other):
c = composite.Composite()
c._members.append(self)
c._members.append(other)
return c
Altri suggerimenti
Il problema è che si ottiene importazioni circolari, giusto?
importazione semplice nel metodo __add__
invece che nella parte superiore del file per evitare dipendenza circolare. Si rallenta il metodo __add__
un po ', ma di solito non in modo significativo.