在Python中转发类的前向声明

时间:2010-12-21 01:01:22

标签: python class-design forward-declaration method-resolution-order

以下程序可以成功运行:

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导入{ {1}}我无法将composite.py导入Composite

如何修改类定义,以便保存单独的文件?

谢谢。

PS。我已经阅读了几个与“前向声明”相关的答案,但找不到我特定问题的答案。

2 个答案:

答案 0 :(得分:5)

由于在调用方法之前不需要任何引用,因此循环导入可以在此处工作。诀窍是使用完全限定的引用。

import composite

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

答案 1 :(得分:2)

问题是你得到循环导入,对吗?

import在__add__方法中简单而不是在文件的顶部,以避免循环依赖。它会稍微降低__add__方法的速度,但通常不会显着。