装饰器: 装饰器的本质是一个闭包函数,作用在于不改变原函数功能和调用方法的基础上给它添加额外的功能.装饰器在装饰一个函数时,原函数就成了一个新的函数,也就是说其属性会发生变化,所以为了不改变原函数的属性,我们会调用functools中的wraps装饰器来保证原函数的属性不变.下边以一个简单的例子展示wraps装饰器的作用 : 在学习装饰器的时候,会在作为装饰器的函数中加入一个functools的wraps装饰器,解释下这个函数的作用,上代码!!!
1.加入wraps装饰器时
import time
from functools import wraps
def wrap(func):
@wraps(func)
def b():
'b'
print('name1',b.__doc__,b.__name__)
start = time.time()
func()
end = time.time()
print("abc:",end-start)
return b
@wrap
def a():
'a'
for i in range(100000):
i = i+1
a()
print('name:',a.__name__)
2.不加入wraps装饰器时
import time
def warp(func):
def b():
'b'
print('name1',b.__doc__,b.__name__)
start = time.time()
func()
end = time.time()
print("abc:",end-start)
return b
@warp
def a():
'a'
for i in range(100000):
i = i+1
a()
print('name:',a.__doc__, a.__name__)
3、总结 经过肉眼分析可知,不加wraps装饰器会导致一个问题: 被装饰的函数的属性,例如__name__和__doc__会被改变,偏离了装饰器的初衷,故有了wraps。
如果你觉得本文对你有帮助,记得点赞、投币、收藏,支持一下up主,那么我们下期再见*
|