Фоуард объявление классов в Python
-
12-10-2019 - |
Вопрос
Следующая программа может успешно работать:
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__
Метод несколько, но обычно не существенно.