以下程序可以成功运行:

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。我已经阅读了与“远期声明”有关的几个答案,但找不到解决我的特定问题的答案。

有帮助吗?

解决方案

由于不需要参考,直到调用该方法,循环导入 能够 在这里工作。诀窍是使用完全合格的参考。

import composite

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

其他提示

问题是您获得了循环进口,对吗?

导入简单 __add__ 方法而不是在文件的顶部避免循环依赖。它会减慢 __add__ 方法有点,但通常没有显着。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top