1. ホーム
  2. python

[解決済み] Pythonでクラスの属性をキャッシュする

2022-11-30 06:32:25

質問

私はpythonでクラスを書いていて、計算に比較的長い時間がかかる属性を持っています。 私はそれを一度だけ行いたい . また、それはクラスのすべてのインスタンスで必要とされるわけではないので デフォルトで行いたいわけではなく __init__ .

私はPythonは初めてですが、プログラミングは初めてではありません。 私はこれを行う方法をかなり簡単に思いつくことができますが、何かを行うための「Pythonic」方法は、しばしば私が他の言語での経験を使用して思いつくものよりもはるかに単純であることを何度も発見しています。

Pythonでこれを行うための「正しい」方法はあるのでしょうか?

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

Python ≥ 3.8 @property そして @functools.lru_cache が統合され @cached_property .

import functools
class MyClass:
    @functools.cached_property
    def foo(self):
        print("long calculation here")
        return 21 * 2

Python ≥ 3.2 < 3.8

両方の @property @functools.lru_cache のデコレータがあります。

import functools
class MyClass:
    @property
    @functools.lru_cache()
    def foo(self):
        print("long calculation here")
        return 21 * 2

この回答 は、より詳細な例と、以前のPythonバージョン用のバックポートに言及しています。

Python < 3.2

Python の wiki には キャッシュプロパティデコレータ (MIT licensed) があり、このように使うことができます。

import random
# the class containing the property must be a new-style class
class MyClass(object):
   # create property whose value is cached for ten minutes
   @cached_property(ttl=600)
   def randint(self):
       # will only be evaluated every 10 min. at maximum.
       return random.randint(0, 100)

または、他の回答で言及されている実装で、あなたのニーズに合うもの。

または、上記のバックポート。