装饰器里面再用一个装饰器@wraps是为什么呢?
本来上面是一个简单的登陆校验器(截图中注释写错了,不是校验密码),在用户登陆后台是校验是否已经电脑正常登陆,如下图所示:
但是我们注意到,在这个登陆校验装饰器中,又额外增加了一个装饰器@wraps,那这个装饰器是什么作用呢?根据我自己百度后理解的的结果就是:这个是用来还原函数两个变量值的:
1、显示 正在执行的函数的名称 f.name
2、显示 正在执行的函数的注释 f.doc
如果没使用@wraps,当A调用了装饰器B的话,即使A.name,返回的会是装饰器B的函数名称,而不是A的函数名称
如果使用了@wraps,当A调用了装饰器B的话,A.__name__返回的会是A函数的名称,而不是饰器B的名称,这也即使常说的@wraps是装饰器的修复技术,实际就是修复还原了A的__name__变量,同理__doc__变量也是一样。
具体例子如下:
# 普通函数:
def f():
"""
这是一个用来测试装饰器修复技术的函数
"""
print("哈哈哈")
if __name__ == '__main__':
print("执行的函数名:", f.__name__)
print("函数的注释:", f.__doc__)
# 打印结果
执行的函数名: f
函数的注释: 这是一个用来测试装饰器修复技术的函数
#添加装饰器,但不添加@wraps修复
def wrapper(func):
def inner(*args, **kwargs):
print("在前面执行的代码。。。。")
func()
print("在后面执行的代码...")
return inner
@wrapper
def f():
"""
这是一个用来测试装饰器修复技术的函数
"""
print("哈哈哈")
if __name__ == '__main__':
print("执行的函数名:", f.__name__)
print("函数的注释:", f.__doc__)
# 打印结果
执行的函数名: inner
函数的注释: None
# 添加装饰器修复技术@wraps
from functools import wraps
def wrapper(func):
@wraps(func)
def inner(*args, **kwargs):
print("在前面执行的代码。。。。")
func()
print("在后面执行的代码...")
return inner
@wrapper
def f():
"""
这是一个用来测试装饰器修复技术的函数
"""
print("哈哈哈")
if __name__ == '__main__':
print("执行的函数名:", f.__name__)
print("函数的注释:", f.__doc__)
# 打印结果
执行的函数名: f
函数的注释: 这是一个用来测试装饰器修复技术的函数
例子来自:https://blog.csdn.net/aaronthon/article/details/81714521