我知道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
1条答案
按热度按时间gudnpqoy1#
您的困惑源于装饰器运行的 when。
相当于
也就是说,在函数被定义之后,装饰器立即被调用,调用装饰器的结果被赋值回原来的函数名,它只在定义的时候被调用一次,而不是每次函数调用都被调用一次。
类也是如此。语法
相当于