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中for循环的使用
Apr 14 Python
python中迭代器(iterator)用法实例分析
Apr 29 Python
python中字典(Dictionary)用法实例详解
May 30 Python
详解Python之数据序列化(json、pickle、shelve)
Mar 30 Python
定制FileField中的上传文件名称实例
Aug 23 Python
Python排序搜索基本算法之选择排序实例分析
Dec 09 Python
python使用matplotlib画饼状图
Sep 25 Python
Python的iOS自动化打包实例代码
Nov 22 Python
python控制nao机器人身体动作实例详解
Apr 29 Python
Python2和3字符编码的区别知识点整理
Aug 08 Python
python绘制无向图度分布曲线示例
Nov 22 Python
python目标检测给图画框,bbox画到图上并保存案例
Mar 10 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(一)
2012/03/21 PHP
PHP+Redis事务解决高并发下商品超卖问题(推荐)
2020/08/03 PHP
alixixi runcode.asp的代码不错的应用
2007/08/08 Javascript
最新28个很棒的jQuery 教程
2011/05/28 Javascript
为什么要在引入的css或者js文件后面加参数的详细讲解
2013/05/03 Javascript
通过js获取div的background-image属性
2013/10/15 Javascript
jquery 循环显示div的示例代码
2013/10/18 Javascript
jQuery 快速结束当前正在执行的动画
2013/11/20 Javascript
JavaScript判断textarea值是否为空并给出相应提示
2014/09/04 Javascript
node.js中的fs.statSync方法使用说明
2014/12/16 Javascript
基于jQuery实现的扇形定时器附源码下载
2015/10/20 Javascript
jQuery Easyui datagrid/treegrid 清空数据
2016/07/09 Javascript
微信小程序 弹幕功能简单实例
2017/02/14 Javascript
jQuery实现节点的追加、替换、删除、复制功能示例
2017/07/11 jQuery
javascript标准库(js的标准内置对象)总结
2018/05/26 Javascript
Node.js中你不可不精的Stream(流)
2018/06/08 Javascript
Python正则表达式知识汇总
2017/09/22 Python
python如何判断IP地址合法性
2020/04/05 Python
Python 创建守护进程的示例
2020/09/29 Python
5个你不知道的HTML5的接口介绍
2013/08/07 HTML / CSS
Lookfantastic美国/加拿大:英国知名美妆购物网站
2019/03/27 全球购物
资生堂英国官网:Shiseido英国
2020/12/30 全球购物
怎样在程序里获得一个空指针
2015/01/24 面试题
LINUX下线程,GDI类的解释
2016/12/14 面试题
最新党员的自我评价分享
2013/11/04 职场文书
教师求职自荐信
2014/03/09 职场文书
副校长竞聘演讲稿
2014/09/01 职场文书
社区端午节活动总结
2015/02/11 职场文书
2015年绩效考核工作总结
2015/05/23 职场文书
幸福终点站观后感
2015/06/04 职场文书
检讨书之工作不认真
2019/08/14 职场文书
创业计划书之孕婴生活馆
2019/11/11 职场文书
只用20行Python代码实现屏幕录制功能
2021/06/02 Python
python APScheduler执行定时任务介绍
2022/04/19 Python
Vue OpenLayer测距功能的实现
2022/04/20 Vue.js
Windows server 2012 配置Telnet以及用法详解
2022/04/28 Servers