Вопрос

Следующая программа может успешно работать:

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')]

Я хотел бы сохранить определение Simple, Composite, а также __main__ в трех разных файлах, но я не могу этого сделать, потому что я не могу импортировать Simple в composite.py И я не могу импортировать Composite в simple.py.

Как бы вы изменили определение класса, чтобы сохранить отдельные файлы?

Спасибо.

Пса Я прочитал несколько ответов, связанных с «Декларацией, но не смог найти ответа на мою конкретную проблему.

Это было полезно?

Решение

Поскольку ни одна из ссылок не требуется до тех пор, пока методы не будут не названы, круглый импорт Можно работать здесь. Хитрость заключается в том, чтобы использовать полностью квалифицированные ссылки.

import composite

class Simple(object):
   ...
  def __add__(self, other):
    c = composite.Composite()
    c._members.append(self)
    c._members.append(other)
    return c

Другие советы

Проблема в том, что вы получаете круглый импорт, верно?

импортировать простой в __add__ Метод вместо верхней части файла, чтобы избежать круговой зависимости. Это замедлит __add__ Метод несколько, но обычно не существенно.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top