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 相关文章推荐
centos下更新Python版本的步骤
Feb 12 Python
Python使用xlrd模块操作Excel数据导入的方法
May 26 Python
机器学习python实战之手写数字识别
Nov 01 Python
django 将model转换为字典的方法示例
Oct 16 Python
Windows平台Python编程必会模块之pywin32介绍
Oct 01 Python
利用Python产生加密表和解密表的实现方法
Oct 15 Python
Python识别html主要文本框过程解析
Feb 18 Python
利用python生成照片墙的示例代码
Apr 09 Python
Python3.7下安装pyqt5的方法步骤(图文)
May 12 Python
Python调用Redis的示例代码
Nov 24 Python
pip 20.3 新版本发布!即将抛弃 Python 2.x(推荐)
Dec 16 Python
详解python的xlwings库读写excel操作总结
Feb 26 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简单获取复选框值的方法
2016/05/11 PHP
PHP使用星号隐藏用户名,手机和邮箱的实现方法
2016/09/22 PHP
Json_decode 解析json字符串为NULL的解决方法(必看)
2017/02/17 PHP
PHP文字转图片功能原理与实现方法分析
2017/08/31 PHP
Laravel框架使用技巧之使用url()全局函数返回前一个页面的地址方法详解
2020/04/06 PHP
jQuery阻止同类型事件小结
2013/04/19 Javascript
js制作带有遮罩弹出层实现登录注册表单特效代码分享
2015/09/05 Javascript
Treegrid的动态加载实例代码
2016/04/29 Javascript
详谈jQuery中的一些正则匹配表达式
2017/03/08 Javascript
js简易版购物车功能
2017/06/17 Javascript
[js高手之路]HTML标签解释成DOM节点的实现方法
2017/08/31 Javascript
简单实现jquery隔行变色
2017/11/09 jQuery
vue 自定指令生成uuid滚动监听达到tab表格吸顶效果的代码
2020/09/16 Javascript
解决vux 中popup 组件Mask 遮罩在最上层的问题
2020/11/03 Javascript
python矩阵转换为一维数组的实例
2018/06/05 Python
Python下调用Linux的Shell命令的方法
2018/06/12 Python
Python实现的NN神经网络算法完整示例
2018/06/19 Python
对python中数组的del,remove,pop区别详解
2018/11/07 Python
Python使用Excel将数据写入多个sheet
2020/05/16 Python
如何解决python多种版本冲突问题
2020/10/13 Python
如何在Win10系统使用Python3连接Hive
2020/10/15 Python
GNC健安喜官方海外旗舰店:美国著名保健品牌
2017/01/04 全球购物
英国著名的小众美容品牌网站:Alyaka
2017/08/08 全球购物
英国领先的运动物理治疗供应公司:Vivomed
2018/07/14 全球购物
美国电力供应商店/电气批发商:USESI
2018/10/12 全球购物
英国最大的纸工艺品商店:CraftStash
2018/12/01 全球购物
int *p=NULL和*p= NULL有什么区别
2014/10/23 面试题
轻金属冶金专业毕业生自荐信
2013/11/02 职场文书
毕业生就业自荐书
2013/12/15 职场文书
政府采购方案
2014/06/12 职场文书
工地门卫岗位职责范本
2014/07/01 职场文书
离职证明标准格式
2014/09/15 职场文书
应届毕业生求职简历自我评价
2015/03/02 职场文书
求职意向书范本
2015/05/11 职场文书
2015初中教导处工作总结
2015/07/21 职场文书
简述Java中throw-throws异常抛出
2021/08/07 Java/Android