Python中的类的前向声明

0 投票
2 回答
1253 浏览
提问于 2025-04-16 08:49

下面这个程序可以正常运行:

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

我想把 SimpleComposite__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

撰写回答