我正在研究Python中的一些懒加载属性装饰器,并偶然发现了这个例子 (http://code.activestate.com/recipes/363602-lazy-property-evaluation/):
class Lazy(object):
def __init__(self, calculate_function):
self._calculate = calculate_function
def __get__(self, obj, _=None):
if obj is None:
return self
value = self._calculate(obj)
setattr(obj, self._calculate.func_name, value)
return value
# Sample use:
class SomeClass(object):
@Lazy
def someprop(self):
print 'Actually calculating value'
return 13
o = SomeClass()
o.someprop
o.someprop
我的问题是,这是如何工作的?我对装饰器的理解是它们必须是可调用的(因此必须是函数或实现 __call__
的调用),但是这里的 Lazy
明显不是,如果我尝试 Lazy(someFunc)()
,它会像预期的那样引发异常。我错过了什么吗?