python装饰器是用于拓展原来函数功能的一种函数,这个函数的特殊之处在于它的返回值也是一个函数。
Python内置的functools.wraps可以规避这个问题,它的实现等同于wrapper.__name__ = func.__name__
修改后的代码如下,此时函数的__name__属性不会被更改
使用python装饰器的好处就是在不用更改原函数的代码前提下给函数增加新的功能。
尝试写一个最简单的装饰器:
def log(func):
def wrapper():
print('1')
func()
print('2')
return wrapper
@log
def hello():
print("hello world")
if __name__ == "__main__":
hello()
print(hello.__name__) #此时打印出函数的名字会被改变为 wrapper
因为返回的那个wrapper()函数名字就是'wrapper',所以,需要把原始函数的__name__等属性复制到wrapper()函数中,否则有些依赖函数签名的代码执行就会出错。Python内置的functools.wraps可以规避这个问题,它的实现等同于wrapper.__name__ = func.__name__
修改后的代码如下,此时函数的__name__属性不会被更改
import functools
def log(func):
@functools.wraps(func)
def wrapper():
print('1')
func()
print('2')
return wrapper
@log
def hello():
print("hello world")
if __name__ == "__main__":
hello()
print(hello.__name__)#此时打印出函数的名字仍旧是hello
看到一篇文章解释装饰器很清楚,转一下:
https://blog.youkuaiyun.com/xiangxianghehe/article/details/77170585