Python 3.8+functoolsпонятие
functools.cached_property
кэширование
Вычисляет значение свойства один раз и сохраняет в __dict__ экземпляра. При повторном обращении возвращает кэш без вызова метода.
Синтаксис
@functools.cached_property
Кеш сам не сбрасывается: если поля объекта изменились, свойство продолжит отдавать старое значение, пока его не удалить через del obj.area. Работает только у классов с обычным __dict__ — с __slots__ не заведётся, потому что значение просто некуда положить. С Python 3.12 общей блокировки больше нет, так что в многопоточном коде значение может посчитаться несколько раз.
Примеры
from functools import cached_property
class Circle:
def __init__(self, r): self.r = r
@cached_property
def area(self):
return 3.14159 * self.r ** 2
c = Circle(5)
print(c.area) # → 78.53975
print(c.area) # → 78.53975 (без вычисления)
print('area' in c.__dict__) # → True
print(type(c.__dict__['area'])) # → <class 'float'>
См. также
Открыть в полном глоссарииdocs.python.orgСообщить о неточности