python进阶(18)@wraps装饰器
2021/4/29 12:26:50
本文主要是介绍python进阶(18)@wraps装饰器,对大家解决编程问题具有一定的参考价值,需要的程序猿们随着小编来一起学习吧!
前言
我们都知道装饰器的作用是在不改变原有的代码基础上,添加新的功能,但是这样会有一个弊端,被装饰的函数某些属性会变改变,接下来我们来看下
案例
import time def run_time(func): def wrapper(*args, **kwargs): """时间装饰器""" time1 = time.time() func(*args, **kwargs) time2 = time.time() cost_time = time2 - time1 return f"函数花了{cost_time}秒" return wrapper @run_time def test(): """测试""" print([i for i in range(1, 100001) if i % 200 == 0]) if __name__ == '__main__': print(test.__name__) print(test.__doc__) """ 结果 # wrapper # 时间装饰器 """
可以看到,我们明明打印的是test函数的__name__
属性,最后显示的却是run_time
的属性。
我们知道@run_time
装饰器实际上就等于test = run_time(test)
,此时我们打印test.__name__
实际上test已经指向了wrapper
,这样会造成我们打印的时候会打印装饰器的内嵌函数的名字和注释。
使用wraps装饰器解决
wraps
可以将原函数对象的指定属性复制给包装函数对象, 默认有 __module__
、__name__
、__doc__
、__qualname__
、__annotations__
或者通过参数选择
import time from functools import wraps def run_time(func): @wraps(func) def wrapper(*args, **kwargs): """时间装饰器""" time1 = time.time() func(*args, **kwargs) time2 = time.time() cost_time = time2 - time1 return f"函数花了{cost_time}秒" return wrapper @run_time def test(): """测试""" print([i for i in range(1, 100001) if i % 200 == 0]) if __name__ == '__main__': print(test.__name__) print(test.__doc__) """ 结果: test 测试 """
我们就只在原来的wrapper
内函数上加了一个@wraps(func)
装饰器,就可以打印出我们想要的结果了,这是因为wraps
可以将原函数对象的指定属性复制给包装函数对象,我们可以查看它的源码
def wraps(wrapped, assigned = WRAPPER_ASSIGNMENTS, updated = WRAPPER_UPDATES): """Decorator factory to apply update_wrapper() to a wrapper function Returns a decorator that invokes update_wrapper() with the decorated function as the wrapper argument and the arguments to wraps() as the remaining arguments. Default arguments are as for update_wrapper(). This is a convenience function to simplify applying partial() to update_wrapper(). """ return partial(update_wrapper, wrapped=wrapped, assigned=assigned, updated=updated)
这篇关于python进阶(18)@wraps装饰器的文章就介绍到这儿,希望我们推荐的文章对大家有所帮助,也希望大家多多支持为之网!
- 2024-12-28Python编程基础教程
- 2024-12-27Python编程入门指南
- 2024-12-27Python编程基础
- 2024-12-27Python编程基础教程
- 2024-12-27Python编程基础指南
- 2024-12-24Python编程入门指南
- 2024-12-24Python编程基础入门
- 2024-12-24Python编程基础:变量与数据类型
- 2024-12-23使用python部署一个usdt合约,部署自己的usdt稳定币
- 2024-12-20Python编程入门指南