python装饰器的作用是在不改变原函数结构的情况下,对一个目标函数功能的扩展。但是被装饰器修饰的函数,其函数名等函数属性会发生改变,这就相当于另外一个函数了。所以在python中提供了装饰器wraps(func)来解决这个问题。
下面用一个例子进行说明:
不使用wraps装饰器的情况
import time
from functools import wraps
def timeit(func):
def wrapper(*args, **kwargs):
"""这是timeit,装饰器"""
start = time.time()
ret = func(*args, **kwargs)
end = time.time()
print('used:',end-start)
return ret
return wrapper
@timeit
def foo():
"""这是foo,被装饰函数"""
print('in foo()')
print(foo.__name__)
print(foo.__doc__)
打印的结果是:
使用wraps装饰器的情况
import time
from functools import wraps
def timeit(func):
@wraps(func)
def wrapper(*args, **kwargs):
"""这是timeit,装饰器"""
start = time.time()
ret = func(*args, **kwargs)
end = time.time()
print('used:',end-start)
return ret
return wrapper
@timeit
def foo():
"""这是foo,被装饰函数"""
print('in foo()')
print(foo.__name__)
print(foo.__doc__)
打印结果:
对比两次的打印结果发现,不使用wraps装饰器的时候,函数的名字等属性都发生了变化,使用wraps装饰器后,被装饰的函数还是能保持原先函数的属性不变,这就是wraps装饰器的神奇之处。好了,这次关于wraps装饰器就讲到这里了,关于wraps的更多信息可以参考python的官方文档进行了解。