1. ホーム
  2. python

[解決済み] Python メモイズ/遅延ルックアップ プロパティ デコレータ

2022-10-07 04:32:45

質問

最近、インスタンス属性がデータベースに保存された値を反映する多くのクラスを含む既存のコードベースを調べました。私はこれらの属性の多くをリファクタリングして、データベースの検索を遅延させました。これらの属性はインスタンスの寿命が尽きるまで変化しませんが、最初の計算がボトルネックになり、特別な場合にのみアクセスされるようになります。したがって、データベースから取得した後にキャッシュすることもできます (したがって、これは メモ化 の定義に当てはまります)。

私は、さまざまなクラスにわたるさまざまな属性のために、コードの次のスニペットを何度も何度も入力していることに気づきました。

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がこのために多くの既製のデコレータを含む前にされました。私は用語を修正するためだけにそれを更新しました。

どのように解決するのですか?

あらゆる種類の素晴らしいユーティリティのために、私は ボルトン .

そのライブラリの一部として cachedproperty :

from boltons.cacheutils import cachedproperty

class Foo(object):
    def __init__(self):
        self.value = 4

    @cachedproperty
    def cached_prop(self):
        self.value += 1
        return self.value


f = Foo()
print(f.value)  # initial value
print(f.cached_prop)  # cached property is calculated
f.value = 1
print(f.cached_prop)  # same value for the cached property - it isn't calculated again
print(f.value)  # the backing value is different (it's essentially unrelated value)