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之list和str比较
Sep 20 Python
Python实现约瑟夫环问题的方法
May 03 Python
浅析Python 中整型对象存储的位置
May 16 Python
用Python实现命令行闹钟脚本实例
Sep 05 Python
python实现学生信息管理系统
Apr 05 Python
python 列表,数组和矩阵sum的用法及区别介绍
Jun 28 Python
Python中使用Counter进行字典创建以及key数量统计的方法
Jul 06 Python
Python字典的基本用法实例分析【创建、增加、获取、修改、删除】
Mar 05 Python
python3对接mysql数据库实例详解
Apr 30 Python
Python集合基本概念与相关操作实例分析
Oct 30 Python
Pytorch 搭建分类回归神经网络并用GPU进行加速的例子
Jan 09 Python
python - asyncio异步编程
Apr 06 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 EOT定界符的使用详解
2008/09/30 PHP
Yii框架调试心得--在页面输出执行sql语句
2014/12/25 PHP
Laravel框架中队列和工作(Queues、Jobs)操作实例详解
2020/04/06 PHP
js的.innerHTML = ""IE9下显示有错误的解决方法
2013/09/16 Javascript
jquery实现鼠标拖动图片效果示例代码
2014/01/09 Javascript
jQuery-1.9.1源码分析系列(十)事件系统之事件体系结构
2015/11/19 Javascript
jquery 全选、全不选、反选效果的实现代码【推荐】
2016/05/05 Javascript
js接收并转化Java中的数组对象的方法
2016/08/11 Javascript
AngularJS  ng-table插件设置排序
2016/09/21 Javascript
关于AngularJs数据的本地存储详解
2017/01/20 Javascript
js实现打地鼠小游戏
2017/02/13 Javascript
实现微信小程序的wxml文件和wxss文件在webstrom的支持
2017/06/12 Javascript
Vue服务器渲染Nuxt学习笔记
2018/01/31 Javascript
React实现全局组件的Toast轻提示效果
2018/09/21 Javascript
Vue中用props给data赋初始值遇到的问题解决
2018/11/27 Javascript
vue中的mvvm模式讲解
2019/01/31 Javascript
layui 根据后台数据动态创建下拉框并同时默认选中的实例
2019/09/02 Javascript
Javascript中的this,bind和that使用实例
2019/12/05 Javascript
深入解析微信小程序开发中遇到的几个小问题
2020/07/11 Javascript
three.js 实现露珠滴落动画效果的示例代码
2021/03/01 Javascript
python中使用smtplib和email模块发送邮件实例
2014/04/22 Python
python使用opencv读取图片的实例
2017/08/17 Python
图文详解Django使用Pycharm连接MySQL数据库
2019/08/09 Python
DataFrame.to_excel多次写入不同Sheet的实例
2019/12/02 Python
Python flask框架如何显示图像到web页面
2020/06/03 Python
使用Keras 实现查看model weights .h5 文件的内容
2020/06/09 Python
HTML5 localStorage使用总结
2017/02/22 HTML / CSS
旧时光糖果:Old Time Candy
2018/02/05 全球购物
Bitiba意大利:在线宠物商店
2020/10/31 全球购物
新年团拜会主持词
2014/04/02 职场文书
2015秋季幼儿园开学寄语
2015/03/25 职场文书
奥巴马开学演讲观后感
2015/06/12 职场文书
运动会闭幕式主持词
2015/07/01 职场文书
2016年教师党员承诺书范文
2016/03/24 职场文书
一篇文章弄懂MySQL查询语句的执行过程
2021/05/07 MySQL
pytorch 带batch的tensor类型图像显示操作
2021/05/20 Python