Выбранный ответ является полностью правильным, но добавив еще один пост. Если вы хотите привязать кеш-хранилища к каждому классу, вместо того, чтобы делить одно хранилище со всеми его подклассами, есть другая опция methodtools
import functools
import methodtools
class K:
@classmethod
@functools.lru_cache(maxsize=1)
def mthd(cls, s: str):
print('functools', s)
return s
@methodtools.lru_cache(maxsize=1) # note that methodtools wraps classmethod
@classmethod
def mthd2(cls, s: str):
print('methodtools', s)
return s
class L(K):
pass
K.mthd('1')
L.mthd('2')
K.mthd2('1')
L.mthd2('2')
K.mthd('1') # functools share the storage
L.mthd('2')
K.mthd2('1') # methodtools doesn't share the storage
L.mthd2('2')
Тогда результат будет
$ python example.py
functools 1
functools 2
methodtools 1
methodtools 2
functools 1
functools 2