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__)

打印结果是:

Python装饰器如何实现修复过程解析

但是加上@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__)

打印结果是:

Python装饰器如何实现修复过程解析

其中主要的就是两个变量:

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,装饰器,修复
0
投稿

猜你喜欢

  • Python 格式化输出字符串的方法(输出字符串+数字的几种方法)

    2021-05-03 21:25:00
  • python docx的超链接网址和链接文本操作

    2021-06-05 22:10:55
  • Python全栈之线程详解

    2021-05-21 17:44:21
  • 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
  • 分享几个字体设计

    2007-10-10 13:53:00
  • python 实现非极大值抑制算法(Non-maximum suppression, NMS)

    2021-01-18 21:46:20
  • 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
  • 多线程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
  • Python OpenCV超详细讲解读取图像视频和网络摄像头

    2023-11-26 05:22:36
  • asp之家 网络编程 m.aspxhome.com