Déclaration avant de classes en Python
-
12-10-2019 - |
Question
Le programme suivant peut fonctionner avec succès:
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')]
Je voudrais garder la définition de Simple
, Composite
et __main__
dans trois dossiers différents, mais je ne peux pas le faire parce que je ne peux pas Simple
importer dans composite.py
et je ne peux pas Composite
importer dans simple.py
.
Comment voulez-vous modifier la définition de classe de telle sorte que vous pouvez conserver les fichiers séparés?
Merci.
PS. J'ai lu plusieurs réponses liées à la « déclaration avant » mais n'a pas pu trouver une réponse à mon problème spécifique.
La solution
Étant donné qu'aucune des références sont nécessaires jusqu'à ce que les méthodes sont appelées, les importations circulaires peut travail ici. L'astuce consiste à utiliser des références entièrement qualifiées.
import composite
class Simple(object):
...
def __add__(self, other):
c = composite.Composite()
c._members.append(self)
c._members.append(other)
return c
Autres conseils
Le problème est que vous obtenez les importations circulaires, droit?
Importer simple dans la méthode __add__
au lieu d'en haut du fichier pour éviter la dépendance circulaire. Il un peu ralentir la méthode __add__
, mais généralement pas de manière significative.