質問

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

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.py そして、私はインポートできません Composite の中へ simple.py.

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

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

詩「フォワード宣言」に関連するいくつかの回答を読みましたが、特定の問題に対する答えを見つけることができませんでした。

役に立ちましたか?

解決

メソッドが呼び出されるまで参照は必要ないため、回覧輸入 できる ここで作業してください。トリックは、完全に資格のある参照を使用することです。

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