我想实现变量的延迟加载,但我似乎有点误解了描述符。我想要对象变量,它在第一次访问时将调用 obj.load() 函数,该函数将使用它们的真实值初始化变量。我写
class ToLoad(object):
def __init__(self, loader_name="load")
self.loader_name=loader_name
def __get__(self, obj, type):
if not (hasattr(obj, "_loaded") and obj._loaded):
obj._loaded=True
getattr(obj, self.loader_name)()
return None
class Test(object):
x=ToLoad()
def __init__(self, y):
self.y=y
def load(self):
print("Loading {}".format(self.y))
self.x=self.y
t1=Test(1)
t2=Test(2)
print("A", t1.x)
print("B", t2.x)
print("C", t1.x)
至少在第一次加载时无法返回实际值。有人可以提出另一种解决该问题的方法吗?我不确定如何在get中返回正确的值,因为那时我不知道该属性称为“x”?还有什么办法吗?
该死,无法回答我自己的问题......所以这里是编辑:感谢您的输入!但是,我的 load() 函数不返回变量本身,因为它加载了许多不同的变量。我想尽量减少使用延迟加载的符号。所以我想出了一个装饰器
class to_load:
def __init__(self, *vars, loader="load"):
self.vars=vars
self.loader=loader
def __call__(self, cls):
def _getattr(obj, attr):
if attr in self.vars:
getattr(obj, self.loader)()
return getattr(obj, attr)
else:
raise AttributeError
cls.__getattr__=_getattr
return cls
@to_load("a", "b")
class Test:
def load(self):
print("Loading")
self.a=1
self.b=2
t=Test()
print("Starting")
print(t.a)
print(t.b)
#print(t.c)
那样行吗?我不确定我是否在破坏东西。