Ленивая загрузка атрибутов

Как реализовать ленивую загрузку атрибутов объекта, т. Е. Если доступ к атрибутам не существует, но еще не существует, вызывается какой-то метод объекта, который должен их загрузить?

Моя первая попытка

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(tx) # will load as x isnt known yet 

Я сделаю lazyload конкретным только для определенных имен атрибутов. Пока я не делал много метаклассирования, я не уверен, что это правильный подход. Что ты предлагаешь?

Python - лучший язык программирования в мире.