私は2つのクラスを用意していますが、そのうちの1つは設定コストが高く再利用可能ですが、もう1つはアプリケーションに多くのインスタンスを持ちますが、高価なクラスのインスタンスを再利用できます。これは、例えばによって説明することが容易である:あなたが、私は基本的に財産の最初の使用上の特性をmemoizeする@staticmethod
と@property
を使用することを望ん、ないサイコロた見ることができるようにPythonの静的プロパティのメモ帳
class SomeExpensiveToSetUpClass(object):
def __init__(self):
print("Expensive to set up class initialized")
self.whatever = "Hello"
def do_the_thing(self):
print(self.whatever)
class OftenUsedClass(object):
@staticmethod
@property
def expensive_property():
try:
return OftenUsedClass._expensive_property
except AttributeError:
OftenUsedClass._expensive_property = SomeExpensiveToSetUpClass()
return OftenUsedClass._expensive_property
# I know I could hide the static property in an instance property:
@property
def expensive_property2(self):
try:
return OftenUsedClass._expensive_property
except AttributeError:
OftenUsedClass._expensive_property = SomeExpensiveToSetUpClass()
return OftenUsedClass._expensive_property
#
# And then:
#
# ouc = OftenUsedClass()
# ouc.expensive_property2.do_the_thing()
# ouc.expensive_property2.do_the_thing()
# ouc.expensive_property2.do_the_thing()
#
# but that feels misleading
if __name__ == '__main__':
OftenUsedClass.expensive_property.do_the_thing()
OftenUsedClass.expensive_property.do_the_thing()
OftenUsedClass.expensive_property.do_the_thing()
- 私は」 mは代わりにバックproperty
のインスタンスを取得:
Traceback (most recent call last):
File "memo.py", line 39, in <module>
OftenUsedClass.expensive_property.do_the_thing()
AttributeError: 'property' object has no attribute 'do_the_thing'
私がメモ化デコレータのためのいくつかのパターンを見つけたが、いずれも静的プロパティに。何か不足していますか?または、私は使用すべき別のパターンがありますか?
編集:
私は私の質問を単純化:私はSomeExpensiveToSetUpClass
クラス実装の名前は設定ファイルで供給され、私は最初の時までにその名前を知らないということが含まれている必要がありますOftenUsedClass
がインスタンス化されます。
あなたのサンプルがむしろ複雑なので、私はあなたに従うかどうか分かりませんが、 'SomeExpensiveToSetUpClass()'をシングルトンに変換することはできません(そのクラスのインスタンスは1つだけです)。 "OftenUsedClass"をそのシングルトンに? –
@Rogalski - ありがとう!なぜシングルトンが不可能なのかを明確にしました。申し訳ありませんが、最初は十分にはっきりしていませんでした。 – JStroop
おそらく、これは[遅れて計算されたクラス属性を記述する](http://stackoverflow.com/questions/18289871/lazy-class-property-decorator)でしょう。 '@class_reify def expensive_property():return SomeExpensiveToSetUpClass()' –