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.

Était-ce utile?

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.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top