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


Posted in Python onSeptember 05, 2020

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__变量也是一样。

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

Python 相关文章推荐
Python使用MD5加密字符串示例
Aug 22 Python
python安装以及IDE的配置教程
Apr 29 Python
python判断windows系统是32位还是64位的方法
May 11 Python
Python实现PS图像调整颜色梯度效果示例
Jan 25 Python
tensorflow识别自己手写数字
Mar 14 Python
tensorflow实现图像的裁剪和填充方法
Jul 27 Python
python在回调函数中获取返回值的方法
Feb 22 Python
python celery分布式任务队列的使用详解
Jul 08 Python
Python request中文乱码问题解决方案
Sep 17 Python
Pygame如何使用精灵和碰撞检测
Nov 17 Python
Python如何用re模块实现简易tokenizer
May 02 Python
python标准库ElementTree处理xml
May 20 Python
Python JSON常用编解码方法代码实例
Sep 05 #Python
Python直接赋值及深浅拷贝原理详解
Sep 05 #Python
Python数据库封装实现代码示例解析
Sep 05 #Python
Python‘==‘ 及 ‘is‘相关原理解析
Sep 05 #Python
如何使用 Python 读取文件和照片的创建日期
Sep 05 #Python
Python filter()及reduce()函数使用方法解析
Sep 05 #Python
Python 在 VSCode 中使用 IPython Kernel 的方法详解
Sep 05 #Python
You might like
php使用str_shuffle()函数生成随机字符串的方法分析
2017/02/17 PHP
JavaScript入门教程(2) JS基础知识
2009/01/31 Javascript
使用javascript:将其它类型值转换成布尔类型值的解决方法详解
2013/05/07 Javascript
jQuery实现表格颜色交替显示的方法
2015/03/09 Javascript
javascript实现rgb颜色转换成16进制格式
2015/07/10 Javascript
AnjularJS中$scope和$rootScope的区别小结
2016/09/18 Javascript
JavaScript canvas实现围绕旋转动画
2017/11/18 Javascript
jquery实现点击a链接,跳转之后,该a链接处显示背景色的方法
2018/01/18 jQuery
bootstrap+jquery项目引入文件报错的解决方法
2018/01/22 jQuery
vuex 的简单使用
2018/03/22 Javascript
关于单文件组件.vue的使用
2018/09/20 Javascript
Node.js事件的正确使用方法
2019/04/05 Javascript
layui输入框只允许输入中文且判断长度的例子
2019/09/18 Javascript
JS实现放烟花效果
2020/03/10 Javascript
js实现手表表盘时钟与圆周运动
2020/09/18 Javascript
详解Vue.js3.0 组件是如何渲染为DOM的
2020/11/10 Javascript
10分钟学会js处理json的常用方法
2020/12/06 Javascript
vue下拉刷新组件的开发及slot的使用详解
2020/12/23 Vue.js
[44:10]2018DOTA2亚洲邀请赛 4.5 淘汰赛 EG vs VP 第一场
2018/04/06 DOTA
[01:57]2018年度DOTA2最具潜力解说-完美盛典
2018/12/16 DOTA
[01:16:13]DOTA2-DPC中国联赛 正赛 SAG vs Dragon BO3 第一场 2月22日
2021/03/11 DOTA
python操作日期和时间的方法
2014/03/11 Python
python网络编程学习笔记(10):webpy框架
2014/06/09 Python
Ubuntu 下 vim 搭建python 环境 配置
2017/06/12 Python
python3 pandas 读取MySQL数据和插入的实例
2018/04/20 Python
Python基于opencv调用摄像头获取个人图片的实现方法
2019/02/21 Python
python远程邮件控制电脑升级版
2019/05/23 Python
python中前缀运算符 *和 **的用法示例详解
2020/05/28 Python
python json.dumps() json.dump()的区别详解
2020/07/14 Python
解除劳动合同协议书范本
2014/04/14 职场文书
工程材料采购方案
2014/05/18 职场文书
火灾现场处置方案
2014/05/28 职场文书
城市规划应届毕业生自荐信
2014/07/04 职场文书
查摆问题整改措施范文
2014/10/11 职场文书
浪漫的婚礼主持词
2015/06/30 职场文书
2016年教师学习教师法心得体会
2016/01/20 职场文书