Python中装饰器的内部机制是什么

p4rjhz4m  于 2022-12-21  发布在  Python
关注(0)|答案(1)|浏览(142)

我知道decorator是一个接受另一个函数并扩展其行为的函数,在下面的例子中,我之前假设test()现在有效地等价于decorator(test)()

def decorator(func):
    def wrapper(*args, **kwargs):
        ...
        res = func(*args, **kwargs)
        ...
        return res
    return wrapper

@decorator
def test():
    pass

但是在decorator中添加了一个函数属性,同时运行**test()decorator(test)()后,结果就不一样了,看起来在decorator(test)()**的情况下,确实运行了decorator函数,从而复位了num;当使用@decorator时,decorator函数并没有像我预期的那样运行。

def decorator(func):
    decorator.num = 0
    def wrapper(*args, **kwargs):
        ...
        res = func(*args, **kwargs)
        ...
        return res
    return wrapper

@decorator
def test():
    pass
   
def test2():
    pass

decorator.num = 5
test()
print(decorator.num)

decorator.num = 5
decorator(test2)()
print(decorator.num)

---------------------
5
0
gudnpqoy

gudnpqoy1#

您的困惑源于装饰器运行的 when

@decorator
def foo(): ...

相当于

def foo(): ...

foo = decorator(foo)

也就是说,在函数被定义之后,装饰器立即被调用,调用装饰器的结果被赋值回原来的函数名,它只在定义的时候被调用一次,而不是每次函数调用都被调用一次。
类也是如此。语法

@decorator
class Foo: ...

相当于

class Foo: ...

Foo = decorator(Foo)

相关问题