Recientemente, revisé una base de código existente que contiene muchas clases donde los atributos de instancia reflejan valores almacenados en una base de datos. He refactorizado muchos de estos atributos para que sus búsquedas en la base de datos se difieran, es decir. no debe inicializarse en el constructor sino solo en la primera lectura. Estos atributos no cambian durante la vida útil de la instancia, pero son un verdadero cuello de botella para calcular esa primera vez y solo se accede a ellos realmente para casos especiales. Por lo tanto, también se pueden almacenar en caché después de que se hayan recuperado de la base de datos (esto, por lo tanto, se ajusta a la definición de memorización donde la entrada es simplemente "sin entrada").
Me encuentro escribiendo el siguiente fragmento de código una y otra vez para varios atributos en varias clases:
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
¿Existe un decorador existente para hacer esto en Python que simplemente no conozco? ¿O hay una forma razonablemente sencilla de definir un decorador que haga esto?
Estoy trabajando con Python 2.5, pero las respuestas 2.6 aún pueden ser interesantes si son significativamente diferentes.
Nota
Esta pregunta se hizo antes de que Python incluyera muchos decoradores preparados para esto. Lo he actualizado solo para corregir la terminología.
functools.lru_cache()
.