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.

War es hilfreich?

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.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top