Python装饰器如何实现修复过程解析
作者:Python探索牛 时间:2023-11-22 04:27:43
Python装饰器(decorator)在实现的时候,被装饰后的函数其实已经是另外一个函数了(函数名等函数属性会发生改变),
为了不影响,Python的functools包中提供了一个叫wraps的decorator来消除这样的副作用。写一个decorator的时候,最好在实现之前加上functools的wrap,
它能保留原有函数的名称和docstring。
未加@wraps的时候:
from functools import wraps
def wrapper(func):
# @wraps(func)
def inner(*args, **kwargs):
print("装饰器工作中...")
func(*args, **kwargs)
return inner
@wrapper
def f1(arg):
"""
这是一个测试装饰器修复技术的函数
:param arg: 随便传
:return: 没有
"""
print(arg)
f1('呵呵')
print(f1.__name__,f1.__doc__)
打印结果是:
但是加上@wraps以后:
from functools import wraps
def wrapper(func):
@wraps(func)
def inner(*args, **kwargs):
print("装饰器工作中...")
func(*args, **kwargs)
return inner
@wrapper
def f1(arg):
"""
这是一个测试装饰器修复技术的函数
:param arg: 随便传
:return: 没有
"""
print(arg)
f1('呵呵')
print(f1.__name__,f1.__doc__)
打印结果是:
其中主要的就是两个变量:
1、显示 正在执行的函数的名称 f.name
2、显示 正在执行的函数的注释 f.doc
简单来说就是:
如果没使用@wraps,当A调用了装饰器B的话,即使A.name,返回的会是装饰器B的函数名称,而不是A的函数名称
如果使用了@wraps,当A调用了装饰器B的话,A.__ name__返回的会是A函数的名称,而不是饰器B的名称,
这也即使常说的@wraps是装饰器的修复技术,
实际就是修复还原了A的__ name__变量,同理__ doc__变量也是一样。
来源:https://www.cnblogs.com/djdjdj123/p/12181230.html
标签:Python,装饰器,修复
![](/images/zang.png)
![](/images/jiucuo.png)
猜你喜欢
Python 格式化输出字符串的方法(输出字符串+数字的几种方法)
2021-05-03 21:25:00
python docx的超链接网址和链接文本操作
2021-06-05 22:10:55
![](https://img.aspxhome.com/file/2023/2/133682_0s.jpg)
Python全栈之线程详解
2021-05-21 17:44:21
![](https://img.aspxhome.com/file/2023/4/101224_0s.png)
Oracle对两个数据表交集的查询
2010-07-26 12:51:00
Python3 读取Word文件方式
2021-03-21 22:36:37
Python的for和break循环结构中使用else语句的技巧
2022-07-02 16:59:26
如何处理Oracle中较大的文本数据?
2009-11-11 20:06:00
wxPython色环电阻计算器
2023-12-21 20:08:54
JavaScript 轮播图和自定义滚动条配合鼠标滚轮分享代码贴
2024-04-29 13:40:59
vue3简单封装input组件和统一表单数据详解
2024-04-26 17:41:18
![](https://img.aspxhome.com/file/2023/6/133126_0s.jpg)
分享几个字体设计
2007-10-10 13:53:00
![](https://img.aspxhome.com/file/UploadPic/200710/10/2007101014120666s.jpg)
python 实现非极大值抑制算法(Non-maximum suppression, NMS)
2021-01-18 21:46:20
![](https://img.aspxhome.com/file/2023/7/85307_0s.jpg)
python和php学习哪个更有发展
2023-05-06 17:40:20
Docker 安装 MySQL(8和5.7)
2024-01-26 06:49:48
SQL Server数据库附加失败的解决办法
2024-01-25 05:38:23
![](https://img.aspxhome.com/file/2023/7/97997_0s.png)
多线程python的实现及多线程有序性
2021-11-15 02:49:56
优化SQLServer数据库服务器内存配置的策略
2009-05-13 10:25:00
Python爬虫requests库多种用法实例
2021-01-10 13:31:56
记Qzone项目组视觉设计标注的前前后后
2010-03-24 18:03:00
![](https://img.aspxhome.com/file/UploadPic/20103/24/1321290-25s.jpg)
Python OpenCV超详细讲解读取图像视频和网络摄像头
2023-11-26 05:22:36
![](https://img.aspxhome.com/file/2023/3/105583_0s.png)