Pythonのクラスの宣言
-
12-10-2019 - |
質問
次のプログラムは正常に実行できます。
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__
メソッドは多少ですが、通常は大きくありません。
所属していません StackOverflow