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 ip正则式
May 07 Python
Python聚类算法之基本K均值实例详解
Nov 20 Python
Python算法应用实战之栈详解
Feb 04 Python
Python3中函数参数传递方式实例详解
May 05 Python
Python 一键制作微信好友图片墙的方法
May 16 Python
python实现PID算法及测试的例子
Aug 08 Python
基于django传递数据到后端的例子
Aug 16 Python
Python实现二叉树的最小深度的两种方法
Sep 30 Python
使用Python实现Wake On Lan远程开机功能
Jan 22 Python
利用matplotlib为图片上添加触发事件进行交互
Apr 23 Python
django 解决model中类写不到数据库中,数据库无此字段的问题
May 20 Python
15款Python编辑器的优缺点,别再问我“选什么编辑器”啦
Oct 19 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下连接mssql2005的代码
2011/01/17 PHP
php查询mysql大量数据造成内存不足的解决方法
2015/03/04 PHP
php批量删除操作代码分享
2017/02/26 PHP
PHP预定义接口――Iterator用法示例
2020/06/05 PHP
让网页根据不同IE版本显示不同的内容
2009/02/08 Javascript
JQuery中html()方法使用不当带来的陷阱
2011/04/07 Javascript
jquery+javascript编写国籍控件
2015/02/12 Javascript
如何编写高质量JS代码(续)
2015/02/25 Javascript
利用js判断手机是否安装某个app的多种方案
2017/02/13 Javascript
微信小程序搜索组件wxSearch实例详解
2017/06/08 Javascript
使用JS实现气泡跟随鼠标移动的动画效果
2017/09/16 Javascript
JS实现HTML页面中动态显示当前时间完整示例
2018/07/30 Javascript
小程序api实现promise封装过程解析
2019/11/21 Javascript
javascrpt密码强度校验函数详解
2020/03/18 Javascript
Python数据结构与算法之图的最短路径(Dijkstra算法)完整实例
2017/12/12 Python
Python迭代器和生成器定义与用法示例
2018/02/10 Python
cmd运行python文件时对结果进行保存的方法
2018/05/16 Python
python3实现用turtle模块画一棵随机樱花树
2019/11/21 Python
Django中密码的加密、验密、解密操作
2019/12/19 Python
python实现TCP文件传输
2020/03/20 Python
jupyternotebook 撤销删除的操作方式
2020/04/17 Python
如何使用pycharm连接Databricks的步骤详解
2020/09/23 Python
python中time tzset()函数实例用法
2021/02/18 Python
使用CSS实现阅读进度条
2017/02/27 HTML / CSS
详解canvas drawImage()方法绘制图片不显示的问题
2018/10/08 HTML / CSS
澳大利亚设计的优质鞋类和适合澳大利亚生活方式的服装:Rivers
2019/04/23 全球购物
如何设定的weblogic的热启动模式(开发模式)与产品发布模式
2012/09/08 面试题
JSP和EJB可以共享HttpSession么?EJB里面可以改变session里面的内容
2013/06/05 面试题
百度JavaScript笔试题
2015/01/15 面试题
会计自荐书
2013/12/02 职场文书
办公室主任先进事迹
2014/01/18 职场文书
商务考察邀请函范文
2014/01/21 职场文书
党支部承诺书范文
2014/03/28 职场文书
新入职员工工作总结
2015/10/15 职场文书
Python还能这么玩之只用30行代码从excel提取个人值班表
2021/06/05 Python
Python基础教程,Python入门教程(超详细)
2021/06/24 Python