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