Quiero crear un decorador que funcione como una propiedad, solo llama a la función decorada solo una vez, y en las llamadas subsiguientes siempre devuelve el resultado de la primera llamada. Un ejemplo:Cómo crear decorador para la inicialización lenta de una propiedad
def SomeClass(object):
@LazilyInitializedProperty
def foo(self):
print "Now initializing"
return 5
>>> x = SomeClass()
>>> x.foo
Now initializing
5
>>> x.foo
5
Mi idea era escribir un decorador personalizado para esto. Así que empecé, y esto es lo lejos que llegué:
class LazilyInitializedProperty(object):
def __init__(self, function):
self._function = function
def __set__(self, obj, value):
raise AttributeError("This property is read-only")
def __get__(self, obj, type):
# problem: where to store the value once we have calculated it?
Como se puede ver, no sé dónde almacenar el valor almacenado en caché. La solución más simple parece ser mantener un diccionario, pero me pregunto si hay una solución más elegante para esto.
EDIT Disculpa, me olvidé de mencionar que quiero que la propiedad sea de solo lectura.
Esto podría ser un duplicado de mi pregunta: [Python decorador propiedad perezoso] (http://stackoverflow.com/questions/3012421/python-lazy-property-decorator) – detly
Tienes razón que sea. No lo vi en el buzón de sugerencias. Votando para cerrar. –