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 Tkinter基础控件用法
Sep 03 Python
python requests.post带head和body的实例
Jan 02 Python
Python基于opencv实现的简单画板功能示例
Mar 04 Python
Python实现的对一个数进行因式分解操作示例
Jun 27 Python
python文档字符串(函数使用说明)使用详解
Jul 30 Python
pytorch下使用LSTM神经网络写诗实例
Jan 14 Python
如何利用Python识别图片中的文字
May 31 Python
python读取hdfs并返回dataframe教程
Jun 05 Python
keras slice layer 层实现方式
Jun 11 Python
python日志通过不同的等级打印不同的颜色(示例代码)
Jan 13 Python
python 对xml解析的示例
Feb 27 Python
Python调用腾讯API实现人脸身份证比对功能
Apr 04 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
音乐朗读剧《MARS RED》2021年TV动画化决定!
2020/03/06 日漫
推荐一篇入门级的Class文章
2007/03/19 PHP
PHP数组的交集array_intersect(),array_intersect_assoc(),array_inter_key()函数的小问题
2011/05/29 PHP
解析thinkphp中的导入文件标签
2013/06/20 PHP
PHP的关于变量和日期处理的一些面试题目整理
2015/08/10 PHP
php简单获取复选框值的方法
2016/05/11 PHP
PHP中md5()函数的用法讲解
2019/03/30 PHP
JavaScript去除空格的几种方法
2006/10/03 Javascript
通过遮罩层实现浮层DIV登录的js代码
2014/02/07 Javascript
详解javascript函数的参数
2015/11/10 Javascript
javascript中return,return true,return false三者的用法及区别
2015/11/17 Javascript
详解JSON1:使用TSQL查询数据和更新JSON数据
2016/11/21 Javascript
javascript正则表达式模糊匹配IP地址功能示例
2017/01/06 Javascript
Boostrap栅格系统与自己额外定义的媒体查询的冲突问题
2017/02/19 Javascript
jQuery实现Select下拉列表进行状态选择功能
2017/03/30 jQuery
jQuery Ajax使用FormData上传文件和其他数据后端web.py获取
2017/06/11 jQuery
JavaScript实现的仿新浪微博原生态输入字数即时检查功能【兼容IE6】
2017/09/26 Javascript
Vue 父子组件的数据传递、修改和更新方法
2018/03/01 Javascript
JS实现将二维数组转为json格式字符串操作示例
2018/07/12 Javascript
jQuery实现动画、消失、显现、渐出、渐入效果示例
2018/09/06 jQuery
20道JS原理题助你面试一臂之力(必看)
2019/07/22 Javascript
微信JS-SDK实现微信会员卡功能(给用户微信卡包里发送会员卡)
2019/07/25 Javascript
JQuery样式与属性设置方法分析
2019/12/07 jQuery
[43:58]DOTA2上海特级锦标赛C组败者赛 Newbee VS Archon第二局
2016/02/27 DOTA
深入讲解Python中面向对象编程的相关知识
2015/05/25 Python
python实现感知器算法(批处理)
2019/01/18 Python
Python request操作步骤及代码实例
2020/04/13 Python
巴西网上药房:onofre
2016/11/21 全球购物
司机检讨书
2014/02/13 职场文书
房地产项目建议书
2014/03/12 职场文书
企业总经理助理岗位职责
2014/09/12 职场文书
个人剖析材料及整改措施
2014/10/07 职场文书
2015年大学元旦晚会活动策划书
2014/12/09 职场文书
高校教师个人工作总结2014
2014/12/17 职场文书
区域销售大会开幕词
2016/03/04 职场文书
关于EntityWrapper的in用法
2022/03/22 Java/Android