Pythonの標準ライブラリfunctoolsにある、cacheとlru_cacheデコレータですが、メソッドにも使えそうですが、使ってはいけないということが下記のビデオで詳しく解説されています。
使ってはいけない理由は、キャッシュ付きメソッドがコールされたインスタンスは、一生ガーベージコレクションされないで残ってしまうからということです。メソッドの第一引数にselfが渡されるので、キャッシュがselfをキーとして保存してしまうためです。
この問題は回避可能で、その方法も上記のビデオで紹介されています。
例えば、下記のdoubleをキャッシュしたいとします。
from functools import cache
class Foo:
def __init__():
pass
def double(self, x):
print("Double ", str(x))
return 2 * x
次のように、インスタンス変数にデコレータに通した元のメソッドを代入するとよいようです。
from functools import cache
class Foo:
def __init__(self):
self.double = cache(self._double)
def _double(self, x):
print("Double ", str(x))
return 2 * x