0

次のプログラムは正常に実行できます。

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__3つの異なるファイルに保持したいのですが、にインポートできず、にSimpleインポートできないため、それを行うことができません。composite.pyCompositesimple.py

別々のファイルを保持できるように、クラス定義をどのように変更しますか?

ありがとうございました。

PS。「前方宣言」に関連するいくつかの回答を読みましたが、特定の問題に対する回答が見つかりませんでした。

4

2 に答える 2

5

メソッドが呼び出されるまで参照は必要ないため、ここでは循環インポートを使用できます。秘訣は、完全修飾された参照を使用することです。

import composite

class Simple(object):
   ...
  def __add__(self, other):
    c = composite.Composite()
    c._members.append(self)
    c._members.append(other)
    return c
于 2010-12-21T01:06:52.220 に答える
2

問題は、循環インポートを取得することですよね?

__add__循環依存を回避するために、ファイルの先頭ではなくメソッドにSimpleをインポートします。__add__メソッドの速度が多少低下しますが、通常は大幅に低下しません。

于 2010-12-21T01:06:31.913 に答える