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 相关文章推荐
在Windows服务器下用Apache和mod_wsgi配置Python应用的教程
May 06 Python
python批量实现Word文件转换为PDF文件
Mar 15 Python
详谈Pandas中iloc和loc以及ix的区别
Jun 08 Python
python批量赋值操作实例
Oct 22 Python
使用Python获取并处理IP的类型及格式方法
Nov 01 Python
Python WEB应用部署的实现方法
Jan 02 Python
python自动化之Ansible的安装教程
Jun 13 Python
详解python中的模块及包导入
Aug 30 Python
Python函数的返回值、匿名函数lambda、filter函数、map函数、reduce函数用法实例分析
Dec 26 Python
python爬取王者荣耀全皮肤的简单实现代码
Jan 31 Python
使用TensorFlow直接获取处理MNIST数据方式
Feb 10 Python
Django windows使用Apache实现部署流程解析
Oct 12 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 的ArrayAccess接口 像数组一样来访问你的PHP对象
2010/10/12 PHP
yii上传文件或图片实例
2014/04/01 PHP
php中header设置常见文件类型的content-type
2015/06/23 PHP
php使用file函数、fseek函数读取大文件效率对比分析
2016/11/04 PHP
javascript的对话框详解与参数
2007/03/08 Javascript
javascript引用赋值(地址传值)用法实例
2015/01/13 Javascript
属于你的jQuery提示框(Tip)插件
2016/01/20 Javascript
Bootstrap布局组件教程之Bootstrap下拉菜单
2016/06/12 Javascript
Vue 仿百度搜索功能实现代码
2017/02/16 Javascript
Axios学习笔记之使用方法教程
2017/07/21 Javascript
NodeJS实现视频转码的示例代码
2017/11/18 NodeJs
Bootstrap实现的表格合并单元格示例
2018/02/06 Javascript
Vue组件和Route的生命周期实例详解
2018/02/10 Javascript
jQuery+ajax实现文件上传功能
2020/12/22 jQuery
vue使用过滤器格式化日期
2021/01/20 Vue.js
在Python的Django框架中更新数据库数据的方法
2015/07/17 Python
Python中pygame的mouse鼠标事件用法实例
2015/11/11 Python
Python+Wordpress制作小说站
2017/04/14 Python
Python判断文件或文件夹是否存在的三种方法
2017/07/27 Python
python使用logging模块发送邮件代码示例
2018/01/18 Python
python获取酷狗音乐top500的下载地址 MP3格式
2018/04/17 Python
python实现屏保计时器的示例代码
2018/08/08 Python
python字典的遍历3种方法详解
2019/08/10 Python
python分布式编程实现过程解析
2019/11/08 Python
详解pycharm连接不上mysql数据库的解决办法
2020/01/10 Python
python GUI库图形界面开发之PyQt5窗口背景与不规则窗口实例
2020/02/25 Python
纯CSS3实现圆角效果(含IE兼容解决方法)
2014/05/07 HTML / CSS
深入浅析HTML5中的SVG
2015/11/27 HTML / CSS
Old Navy加拿大官网:美式休闲服饰品牌
2017/09/26 全球购物
新西兰优惠网站:Treat Me
2019/07/04 全球购物
活动宣传策划方案
2014/05/23 职场文书
初中家长评语大全
2014/12/26 职场文书
物流仓管员岗位职责
2015/04/01 职场文书
婚礼父母致辞
2015/07/28 职场文书
2016毕业实习单位评语大全
2015/12/01 职场文书
解决Go gorm踩过的坑
2021/04/30 Golang