gpt4 book ai didi

python - 延迟加载属性

转载 作者:太空狗 更新时间:2023-10-30 01:03:20 26 4
gpt4 key购买 nike

您将如何实现对象属性的延迟加载,即如果属性被访问但尚不存在,则调用一些应该加载这些属性的对象方法?

我的第一次尝试是

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

我将使延迟加载仅特定于某些属性名称。由于我还没有做过很多元分类,所以我不确定这是否是正确的方法。你有什么建议?

最佳答案

似乎一个简单的 property 会做得更好:

@property
def my_attribute():
if not hasattr(self, '_my_attribute'):
do_expensive_operation_to_get_attribute()
return self._my_attribute

关于python - 延迟加载属性,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9275470/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com