这个Python装饰器是如何工作的?

这个Python装饰器是如何工作的?,python,decorator,Python,Decorator,我在Python中看到了一些延迟加载属性装饰器的例子(): 我的问题是,这是如何工作的?我对decorator的理解是,它们必须是可调用的(因此要么是函数,要么是实现\uuuuu调用的调用),但Lazy显然不是这样,如果我尝试Lazy(someFunc)(,它会像预期的那样引发异常。我缺少什么?当在类SomeClass的实例o上访问名为someprop的属性时,如果SomeClass包含名为o的描述符,则使用该描述符的类的\uu get\uu方法。有关描述符的更多信息,请参阅。不要让Lazy在语

我在Python中看到了一些延迟加载属性装饰器的例子():


我的问题是,这是如何工作的?我对decorator的理解是,它们必须是可调用的(因此要么是函数,要么是实现
\uuuuu调用的调用),但
Lazy
显然不是这样,如果我尝试
Lazy(someFunc)(
,它会像预期的那样引发异常。我缺少什么?

当在类
SomeClass
的实例
o
上访问名为
someprop
的属性时,如果
SomeClass
包含名为
o
的描述符,则使用该描述符的类的
\uu get\uu
方法。有关描述符的更多信息,请参阅。不要让
Lazy
在语法上被用作修饰符的事实蒙蔽了它的实例是描述符的事实,因为
Lazy
本身有一个
\uu get\uuu
方法

修饰符语法

    @Lazy
    def someprop(self):
       ...
不超过,也不低于语法糖:

    def someprop(self):
       ...
    someprop = Lazy(someprop)
当它与decorator语法一起使用或直接使用时,
Lazy
上的约束没有什么不同:它必须接受
someprop
(函数)作为它的参数——对它返回的内容没有任何约束。这里,
Lazy
是一个类,因此它返回自身的一个实例,并有一个
\uuu get\uuu
特殊方法,使实例成为一个描述符(因此,当在类
SomeClass
的实例
o
上访问
someprop
属性时,调用所述方法——仅此而已,同样如此

    def someprop(self):
       ...
    someprop = Lazy(someprop)