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.

È stato utile?

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.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top