functools.wraps 的作用是将原函数对象的指定属性复制给包装函数对象, 默认有 module、name、doc,或者通过参数选择。
import functoolsdef itcast1(fun):# 带参数的装饰器#wraps是用来将inner函数的属性设置为fun的属性值@functools.wraps(fun)def inner(*args, **kwargs):print("itcast1 start")fun(*args, **kwargs)print("itcast1 end")return inner
上述代码可表示为:
# def itcast1(fun):# def inner(*args, **kwargs):# print("itcast1 start")# fun(*args, **kwargs)# print("itcast1 end")# inner.__name__ = fun.__name__# inner.__doc__ = fun.__doc__# return inner
>>> @itcast1
... def say_hello():
... print('say_hello')
...
>>> print(say_hello.__name__)
say_hello
若itcast1中没有使用wraps:
>>> def itcast1(fun):
... def inner(*args, **kwargs):
... print('itcast1 start')
... fun(*args, **kwargs)
... print("itcast1 end")
... return inner
...
>>> @itcast1
... def say_hello():
... print('say_hello')
...
>>> print(say_hello.__name__)
inner
>>> say_hello()
itcast1 start
say_hello
itcast1 end