使用python 3.8的实践
3: my_str has been revoked
运行代码后,我得到
{{1}}
这让我感到困惑,因为我还没有进行任何函数调用
答案 0 :(得分:2)
在python中,装饰器在装饰时执行。 您的代码与此等效:
import functools
def print_name2(f):
@functools.wraps(f)
def wrapper(*args, **kwargs):
print('2: {} has been revoked'.format(f.__name__))
return f(*args, **kwargs)
return wrapper
def print_name3(f):
print('3: {} has been revoked'.format(f.__name__))
return f
def my_str(i):
return str(i)
my_str = print_name3(my_str)
def my_str2(i):
return str(i)
my_str2 = print_name2(my_str2)
我们基本上用装饰器函数返回的值替换my_str和my_str2。现在,print_name2返回一个新函数,该函数将打印某些内容,因此为什么什么也不会打印。同时,由于您没有将print_name3包装在新函数中,因此它会立即打印一些内容。