Recentemente, examinei uma base de código existente contendo muitas classes em que os atributos de instância refletem os valores armazenados em um banco de dados. Refatorei muitos desses atributos para que suas pesquisas de banco de dados fossem adiadas, ou seja, não ser inicializado no construtor, mas apenas na primeira leitura. Esses atributos não mudam durante o tempo de vida da instância, mas são um verdadeiro gargalo para calcular aquela primeira vez e só são realmente acessados para casos especiais. Portanto, eles também podem ser armazenados em cache depois de serem recuperados do banco de dados (isso, portanto, se encaixa na definição de memoisation, onde a entrada é simplesmente "sem entrada").
Eu me pego digitando o seguinte snippet de código repetidamente para vários atributos em várias classes:
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
Já existe um decorador para fazer isso em Python que simplesmente não conheço? Ou existe uma maneira razoavelmente simples de definir um decorador que faça isso?
Estou trabalhando em Python 2.5, mas as respostas 2.6 ainda podem ser interessantes se forem significativamente diferentes.
Nota
Essa pergunta foi feita antes que o Python incluísse muitos decoradores prontos para isso. Eu atualizei apenas para corrigir a terminologia.
functools.lru_cache()
.