¿Cómo implementaría la carga diferida de los atributos del objeto, es decir, si se accede a los atributos pero aún no existen, se llama a algún método de objeto que supuestamente los carga?Carga diferida de los atributos
Mi primer intento es
def lazyload(cls):
def _getattr(obj, attr):
if "_loaded" not in obj.__dict__:
obj._loaded=True
try:
obj.load()
except Exception as e:
raise Exception("Load method failed when trying to access attribute '{}' of object\n{}".format(attr, e))
if attr not in obj.__dict__:
AttributeError("No attribute '{}' in '{}' (after loading)".format(attr, type(obj))) # TODO: infinite recursion if obj fails
return getattr(obj, attr)
else:
raise AttributeError("No attribute '{}' in '{}' (already loaded)".format(attr, type(obj)))
cls.__getattr__=_getattr
return cls
@lazyload
class Test:
def load(self):
self.x=1
t=Test() # not loaded yet
print(t.x) # will load as x isnt known yet
haré lazyload específica a ciertos nombres de los atributos únicos. Como todavía no he hecho mucho metaclasificación, no estoy seguro de si ese es el enfoque correcto. ¿Qué sugerirías?
* "metaclases son más profundas mágica del 99% de los usuarios debe preocuparse Si usted se pregunta si los necesita, no lo hace.. " - TP *. Creo que una propiedad según lo sugerido por Daniel sería mejor. –
Estoy usando esta receta http://code.activestate.com/recipes/576563-cached-property/ – reclosedev
@Rik: No estoy pensando si necesito metaclases sino cómo resolver el problema de lazyload. El ejemplo de Daniels aún no lo resuelve del todo, ya que es de solo lectura y no quiero líneas de código duplicadas para cada ocurrencia. ¿Se puede ajustar? – Gerenuk