python解决装饰器中函数name自身属性被闭包覆盖问题
程序员文章站
2022-03-22 17:39:10
...
本博文源于python基础,旨在研究闭包函数对装饰器产生的影响。当我们使用装饰器的时候,应该是希望在不改变原有的代码情况下,为函数或类增添新功能。因此装饰器应运而生。但是在函数再被装饰的时候,name往往被闭包覆盖了。解决这一问题就需要用到装饰器里套装饰wrap。
问题产生原因
在给函数测定运行时间时,打印函数__name__这种属性时,不打印出
func1
func2
而是
inner
inner
上面是源码截图
import time
from functools import wraps
def timer(func):
# @wraps(func)
def inner(*args,**kwargs):
"""
inner
:param args:
:param kwargs:
:return:
"""
start = time.time()
ret = func(*args,**kwargs)
print('执行的时间是: {}'.format(time.time()-start))
return ret
return inner
@timer
def func1():
time.sleep(1)
print('hello I am func1 ')
@timer
def func2():
time.sleep(1)
print('hello I am func2 ')
func1()
func2()
print(func1.__name__)
print(func2.__name__)
# 被装饰的名字不会被inner覆盖
效果
解决问题工具@wraps(func)
就是这个东西,套在timer上面,就可以解决了,结果就变成这样
总结
本博文以一个测定时间的装饰器函数为引发点,提出闭包函数将原函数自身属性覆盖的问题来源,为了研究解决问题之策,引入@wraps(func)这行代码,成功解决了上述问题。希望对大家有所帮助