Нещодавно я пройшов існуючу базу коду, що містить безліч класів, де атрибути екземплярів відображають значення, що зберігаються в базі даних. Я відновив багато цих атрибутів, щоб відкласти їх пошукові бази даних, тобто. не ініціалізується в конструкторі, а лише після першого читання. Ці атрибути не змінюються впродовж життя примірника, але вони є справжнім вузьким місцем для обчислення цього першого разу і лише дійсно доступним для особливих випадків. Отже, вони також можуть бути кешовані після їх отримання з бази даних (отже, це відповідає визначенню запам'ятовування, де вхід просто "не вводиться").
Я можу вводити наступний фрагмент коду знову і знову для різних атрибутів для різних класів:
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 включив для цього чимало готових декораторів. Я оновив його лише для виправлення термінології.
functools.lru_cache()
.