欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

python解决装饰器中函数name自身属性被闭包覆盖问题

程序员文章站 2022-03-22 17:39:10
...

本博文源于python基础,旨在研究闭包函数对装饰器产生的影响。当我们使用装饰器的时候,应该是希望在不改变原有的代码情况下,为函数或类增添新功能。因此装饰器应运而生。但是在函数再被装饰的时候,name往往被闭包覆盖了。解决这一问题就需要用到装饰器里套装饰wrap。

问题产生原因

在给函数测定运行时间时,打印函数__name__这种属性时,不打印出

func1
func2

而是

inner
inner

python解决装饰器中函数name自身属性被闭包覆盖问题

上面是源码截图

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覆盖

效果
python解决装饰器中函数name自身属性被闭包覆盖问题

解决问题工具@wraps(func)

就是这个东西,套在timer上面,就可以解决了,结果就变成这样
python解决装饰器中函数name自身属性被闭包覆盖问题

总结

本博文以一个测定时间的装饰器函数为引发点,提出闭包函数将原函数自身属性覆盖的问题来源,为了研究解决问题之策,引入@wraps(func)这行代码,成功解决了上述问题。希望对大家有所帮助

相关标签: python尝试