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中的exec、eval使用实例
Sep 23 Python
Python使用chardet判断字符编码
May 09 Python
Python求两个文本文件以行为单位的交集、并集与差集的方法
Jun 17 Python
python获得文件创建时间和修改时间的方法
Jun 30 Python
python3.4下django集成使用xadmin后台的方法
Aug 15 Python
Python3.6实现带有简单界面的有道翻译小程序
Apr 16 Python
python 根据字典的键值进行排序的方法
Jul 24 Python
Numpy的简单用法小结
Aug 28 Python
命令行运行Python脚本时传入参数的三种方式详解
Oct 11 Python
python mysql自增字段AUTO_INCREMENT值的修改方式
May 18 Python
Pycharm github配置实现过程图解
Oct 13 Python
matplotlib运行时配置(Runtime Configuration,rc)参数rcParams解析
Jan 05 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
杏林同学录(三)
2006/10/09 PHP
Uncaught exception com_exception with message Failed to create COM object
2012/01/11 PHP
php使用explode()函数将字符串拆分成数组的方法
2015/02/17 PHP
Twig模板引擎用法入门教程
2016/01/20 PHP
Smarty保留变量用法分析
2016/05/23 PHP
Yii模型操作之criteria查找数据库的方法
2016/07/15 PHP
PHP PDOStatement::errorCode讲解
2019/01/31 PHP
自定义一个jquery插件[鼠标悬浮时候 出现说明label]
2011/06/27 Javascript
详解JavaScript中的Unescape()和String() 函数
2015/11/09 Javascript
jquery实现加载进度条提示效果
2015/11/23 Javascript
yarn的使用与升级Node.js的方法详解
2017/06/04 Javascript
JS按钮闪烁功能的实现代码
2017/07/21 Javascript
基于vue 添加axios组件,解决post传参数为null的问题
2018/03/05 Javascript
vue弹窗消息组件的使用方法
2020/09/24 Javascript
微信小程序实现滴滴导航tab切换效果
2018/07/24 Javascript
Vue监听数据渲染DOM完以后执行某个函数详解
2018/09/11 Javascript
详解微信图片防盗链“此图片来自微信公众平台 未经允许不得引用”的解决方案
2019/04/04 Javascript
js+canvas实现纸牌游戏
2020/03/16 Javascript
vue+element实现动态加载表单
2020/12/13 Vue.js
Vue中引入svg图标的两种方式
2021/01/14 Vue.js
零基础写python爬虫之使用Scrapy框架编写爬虫
2014/11/07 Python
解决已经安装requests,却依然提示No module named requests问题
2018/05/18 Python
几行Python代码爬取3000+上市公司的信息
2019/01/24 Python
Python3实现的简单三级菜单功能示例
2019/03/12 Python
python基于SMTP协议发送邮件
2019/05/31 Python
python利用wx实现界面按钮和按钮监听和字体改变的方法
2019/07/17 Python
关于tf.reverse_sequence()简述
2020/01/20 Python
15款Python编辑器的优缺点,别再问我“选什么编辑器”啦
2020/10/19 Python
数据库测试通常都包括哪些方面
2015/11/30 面试题
环卫工人先进事迹材料
2014/06/02 职场文书
党员自我剖析材料
2014/08/31 职场文书
创卫工作总结2015
2015/04/22 职场文书
环境卫生整治简报
2015/07/20 职场文书
反腐倡廉学习心得体会范文
2015/08/15 职场文书
八年级作文之感悟亲情
2019/11/20 职场文书
解决redis sentinel 频繁主备切换的问题
2021/04/12 Redis