Foward объявление классов в Python - PullRequest
0 голосов
/ 21 декабря 2010

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

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.

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

Спасибо.

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

Ответы [ 2 ]

5 голосов
/ 21 декабря 2010

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

import composite

class Simple(object):
   ...
  def __add__(self, other):
    c = composite.Composite()
    c._members.append(self)
    c._members.append(other)
    return c
2 голосов
/ 21 декабря 2010

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

import Простой в методе __add__ вместо верхней части файла, чтобы избежать циклической зависимости. Это несколько замедлит метод __add__, но обычно незначительно.

...