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卸载模块的方法汇总
Jun 07 Python
Python操作Access数据库基本步骤分析
Sep 19 Python
python将ansible配置转为json格式实例代码
May 15 Python
Django ORM框架的定时任务如何使用详解
Oct 19 Python
python实现微信发送邮件关闭电脑功能
Feb 22 Python
python使用Flask操作mysql实现登录功能
May 14 Python
如何优雅地处理Django中的favicon.ico图标详解
Jul 05 Python
python3 拼接字符串的7种方法
Sep 12 Python
python整合ffmpeg实现视频文件的批量转换
May 31 Python
用scikit-learn和pandas学习线性回归的方法
Jun 21 Python
Pandas之ReIndex重新索引的实现
Jun 25 Python
浅谈Python中文件夹和python package包的区别
Jun 01 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
Pain 全世界最小最简单的PHP模板引擎 (普通版)
2011/10/23 PHP
php函数array_merge用法一例(合并同类数组)
2013/02/03 PHP
基于php上传图片重命名的6种解决方法的详细介绍
2013/04/28 PHP
护卫神php套件 php版本升级方法(php5.5.24)
2015/05/10 PHP
php提交post数组参数实例分析
2015/12/17 PHP
php中时间函数date及常用的时间计算
2017/05/12 PHP
PHP开发之归档格式phar文件概念与用法详解【创建,使用,解包还原提取】
2017/11/17 PHP
PHP设计模式之适配器模式定义与用法详解
2018/04/03 PHP
javascript获得服务器端控件的ID的实现代码
2011/12/28 Javascript
JQuery获取各种宽度、高度(format函数)实例
2013/03/04 Javascript
JS 实现导航栏悬停效果(续2)
2013/09/24 Javascript
js实现幻灯片效果(基于jquery插件)
2013/11/05 Javascript
js时间戳格式化成日期格式的多种方法
2013/11/11 Javascript
javascript中的循环语句for语句深入理解
2014/04/04 Javascript
Node.js中用D3.js的方法示例
2017/01/16 Javascript
vue 数组和对象不能直接赋值情况和解决方法(推荐)
2017/10/25 Javascript
django中使用vue.js的要点总结
2019/07/07 Javascript
vue cli3 配置proxy代理无效的解决
2019/10/30 Javascript
vue-iview动态新增和删除的方法
2020/06/17 Javascript
vue 二维码长按保存和复制内容操作
2020/09/22 Javascript
Python打印scrapy蜘蛛抓取树结构的方法
2015/04/08 Python
Python中Collections模块的Counter容器类使用教程
2016/05/31 Python
python实现大转盘抽奖效果
2019/01/22 Python
Python with用法:自动关闭文件进程
2019/07/10 Python
python selenium 执行完毕关闭chromedriver进程示例
2019/11/15 Python
python实现音乐播放器 python实现花框音乐盒子
2020/02/25 Python
python统计字符串中字母出现次数代码实例
2020/03/02 Python
基于python实现破解滑动验证码过程解析
2020/05/28 Python
美国零售商店:Blue&Cream
2017/04/07 全球购物
英国No.1体育用品零售商:SportsDirect.com
2019/10/16 全球购物
优质的学校老师推荐信
2013/10/28 职场文书
夜不归宿检讨书
2014/02/25 职场文书
应聘教师自荐书
2014/06/16 职场文书
世界读书日的活动方案
2014/08/20 职场文书
PyQt5实现多张图片显示并滚动
2021/06/11 Python
Python中 range | np.arange | np.linspace三者的区别
2022/03/22 Python