Недавно я просмотрел существующую базу кода, содержащую множество классов, в которых атрибуты экземпляра отражают значения, хранящиеся в базе данных. Я отредактировал многие из этих атрибутов, чтобы их поиск в базе данных был отложен, т.е. не инициализироваться в конструкторе, а только при первом чтении. Эти атрибуты не изменяются за время существования экземпляра, но они являются настоящим узким местом для вычисления в первый раз и действительно доступны только в особых случаях. Следовательно, их также можно кэшировать после того, как они были извлечены из базы данных (поэтому это соответствует определению мемоизации, где ввод просто «нет ввода»).
Я ловлю себя на том, что снова и снова набираю следующий фрагмент кода для различных атрибутов в разных классах:
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()
.