[解決済み] 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)
関連
-
[解決済み] Pythonには文字列の'contains'サブストリングメソッドがありますか?
-
[解決済み] Pythonで現在時刻を取得する方法
-
[解決済み] Pythonで2つのリストを連結する方法は?
-
[解決済み] ファイルのコピー方法について教えてください。
-
[解決済み] Pythonで例外を手動で発生(スロー)させる
-
[解決済み] Pythonでシングルトンを作成する
-
[解決済み] Pythonの@propertyデコレーターはどのように機能するのでしょうか?
-
[解決済み】ネストされたディレクトリを安全に作成するには?
-
[解決済み】Pythonに三項条件演算子はありますか?
-
[解決済み] PyMongoで.sortを使用する
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
[解決済み] 文字列から先頭と末尾のスペースを削除するには?
-
[解決済み] 範囲指定された浮動小数点数のランダムな配列を生成します。
-
[解決済み] Pythonでマルチプロセッシングキューを使うには?
-
[解決済み] PyQtアプリケーションのスレッド化。QtスレッドとPythonスレッドのどちらを使うか?
-
[解決済み] Pythonによる一対のクロスプロダクト [重複] (英語)
-
[解決済み] Python Empty Generator 関数
-
[解決済み] Pythonでランダムなファイル名を生成する最良の方法
-
[解決済み] PythonのRequestsモジュールを使ってWebサイトに "ログイン "するには?
-
[解決済み] Django filter queryset __in for *every* item in list
-
[解決済み] 新しいpip backtrackingの実行時問題の解決