最近、インスタンス属性がデータベースに保存された値を反映する多くのクラスを含む既存のコードベースを調べました。これらの属性の多くをリファクタリングして、データベースルックアップを延期しました。コンストラクタで初期化されるのではなく、最初の読み取り時にのみ初期化されます。これらの属性はインスタンスの存続期間を通じて変化しませんが、初回の計算では実際のボトルネックであり、特別な場合にのみ実際にアクセスされます。したがって、それらはデータベースから取得された後にキャッシュすることもできます(したがって、これは入力が単に「入力なし」であるメモの定義に適合します)。
さまざまなクラスのさまざまな属性について、次のコードスニペットを何度も入力していることに気づきました。
class testA(object):
def __init__(self):
self._a = None
self._b = None
@property
def a(self):
if self._a is None:
# Calculate the attribute now
self._a = 7
return self._a
@property
def b(self):
#etc
Pythonでこれを行うための既存のデコレータはありますか?または、これを行うデコレータを定義するための合理的に簡単な方法はありますか?
私はPython 2.5で作業していますが、2.6の回答が大幅に異なる場合は、それでも興味深いかもしれません。
注意
この質問は、Pythonがこのための既製のデコレータを多数含む前に行われました。用語を修正するためだけに更新しました。
functools.lru_cache()
。