Python中的类的前向声明
下面这个程序可以正常运行:
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
里。
你会如何修改类的定义,以便可以把它们放在不同的文件里呢?
谢谢。
附言:我看过一些关于“前向声明”的回答,但找不到解决我具体问题的答案。
2 个回答
2
问题是你遇到了循环导入,对吧?
在文件顶部导入Simple会导致循环依赖,所以可以把它放在__add__
方法里面导入。这样做虽然会让__add__
方法的执行速度稍微慢一点,但通常影响不大。
5
因为在调用方法之前不需要任何引用,所以这里的循环导入是可以工作的。关键是要使用完整的引用。
import composite
class Simple(object):
...
def __add__(self, other):
c = composite.Composite()
c._members.append(self)
c._members.append(other)
return c