Как бы вы реализовали отложенную загрузку атрибутов объекта, т. Е. Если атрибуты доступны, но еще не существуют, вызывается какой-то объектный метод, который должен их загрузить?
Мой первый попытка
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
Я сделаю отложенную загрузку только для определенных имен атрибутов. Поскольку я еще не много занимался мета-классом, я не уверен, что это правильный подход. Что бы вы предложили?