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套接字流重定向实例汇总
Mar 03 Python
解决matplotlib库show()方法不显示图片的问题
May 24 Python
PyQt5基本控件使用详解:单选按钮、复选框、下拉框
Aug 05 Python
python中字典按键或键值排序的实现代码
Aug 27 Python
python tkinter组件摆放方式详解
Sep 16 Python
Python数据可视化:幂律分布实例详解
Dec 07 Python
python 字段拆分详解
Dec 17 Python
如何定义TensorFlow输入节点
Jan 23 Python
使用Python爬取弹出窗口信息的实例
Mar 14 Python
Mac PyCharm中的.gitignore 安装设置教程
Apr 16 Python
python调用百度API实现人脸识别
Nov 17 Python
pandas使用函数批量处理数据(map、apply、applymap)
Nov 27 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
在普通HTTP上安全地传输密码
2007/07/21 PHP
thinkPHP的Html模板标签使用方法
2012/11/13 PHP
带你了解PHP7 性能翻倍的关键
2015/11/19 PHP
thinkphp整合系列之极验滑动验证码geetest功能
2019/06/18 PHP
最近项目写了一些js,水平有待提高
2009/01/31 Javascript
关于Javascript模块化和命名空间管理的问题说明
2010/12/06 Javascript
JS分页控件 可用于无刷新分页
2013/07/23 Javascript
鼠标划过实现延迟加载并隐藏层的js代码
2013/10/11 Javascript
javascript:void(0)是什么意思示例介绍
2013/11/17 Javascript
Java File类的常用方法总结
2015/03/18 Javascript
javascript显式类型转换实例分析
2015/04/25 Javascript
浅谈Javascript中Object与Function对象
2015/09/26 Javascript
如何解决jQuery EasyUI 已打开Tab重新加载问题
2016/12/19 Javascript
vue2滚动条加载更多数据实现代码
2017/01/10 Javascript
vue动态生成dom并且自动绑定事件
2017/04/19 Javascript
JS判断时间段的实现代码
2017/06/14 Javascript
详解VUE 数组更新
2017/12/16 Javascript
JS实现运动缓冲效果的封装函数示例
2018/02/18 Javascript
vue展示dicom文件医疗系统的实现代码
2018/08/27 Javascript
vue点击按钮动态创建与删除组件功能
2019/12/29 Javascript
JavaScript数组常用的增删改查与其他属性详解
2020/10/13 Javascript
基于numpy中数组元素的切片复制方法
2018/11/15 Python
基于python if 判断选择结构的实例详解
2019/05/06 Python
python数据预处理 :数据抽样解析
2020/02/24 Python
如何在scrapy中捕获并处理各种异常
2020/09/28 Python
如何一键升级Python所有包
2020/11/05 Python
如何查看python关键字
2021/01/17 Python
新西兰珠宝品牌:Michael Hill
2017/09/16 全球购物
Herve Leger官网:标志性绷带连衣裙等
2018/12/26 全球购物
公司财务自我评价分享
2013/12/17 职场文书
解除劳动合同协议书范本
2014/09/13 职场文书
学习党的群众路线对照检查材料
2014/09/29 职场文书
实习生个人总结范文
2015/02/28 职场文书
新手入门Jvm-- JVM对象创建与内存分配机制
2021/06/18 Java/Android
解决MySQL Varchar 类型尾部空格的问题
2022/04/06 MySQL
tomcat默认最大连接数及相关调整方法
2022/05/06 Servers