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类继承用法实例分析
Oct 10 Python
用Python计算三角函数之acos()方法的使用
May 15 Python
Python的Django框架中forms表单类的使用方法详解
Jun 21 Python
Python简单获取自身外网IP的方法
Sep 18 Python
python中requests小技巧
May 10 Python
python 多个参数不为空校验方法
Feb 14 Python
PyQt5 在label显示的图片中绘制矩形的方法
Jun 17 Python
在django中,关于session的通用设置方法
Aug 06 Python
Python 文件操作之读取文件(read),文件指针与写入文件(write),文件打开方式示例
Sep 29 Python
Django 5种类型Session使用方法解析
Apr 29 Python
Keras之fit_generator与train_on_batch用法
Jun 17 Python
appium+python自动化配置(adk、jdk、node.js)
Nov 17 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中的超全局变量
2006/10/09 PHP
php安全之直接用$获取值而不$_GET 字符转义
2012/06/03 PHP
ThinkPHP的cookie和session冲突造成Cookie不能使用的解决方法
2014/07/01 PHP
php+ajax实时输入自动搜索匹配的方法
2014/12/26 PHP
PHP对象链式操作实现原理分析
2016/10/09 PHP
php实现对短信验证码发送次数的限制实例讲解
2021/03/04 PHP
Aster vs Newbee BO5 第三场2.19
2021/03/10 DOTA
jquery新的绑定事件机制on方法的使用方法
2014/04/15 Javascript
javascript设计简单的秒表计时器
2020/09/05 Javascript
前端js实现文件的断点续传 后端PHP文件接收
2016/10/14 Javascript
原生js实现网易轮播图效果
2020/04/10 Javascript
详解JavaScript跨域总结与解决办法
2016/10/31 Javascript
Angular.Js的自动化测试详解
2016/12/09 Javascript
jQuery实现的分页功能示例
2017/01/22 Javascript
JavaScript实现写入文件到本地的方法【基于FileSaver.js插件】
2018/03/15 Javascript
node.js部署之启动后台运行forever的方法
2018/05/23 Javascript
微信小程序实现圆形进度条动画
2020/11/18 Javascript
JS常用正则表达式超全集(密码强度校验,金额校验,IE版本,IPv4,IPv6校验)
2020/02/03 Javascript
[46:02]DOTA2上海特级锦标赛D组资格赛#2 Liquid VS VP第二局
2016/02/28 DOTA
[47:22]Mineski vs Winstrike 2018国际邀请赛小组赛BO2 第二场 8.16
2018/08/17 DOTA
[00:37]食人魔魔法师轮盘吉兆顺应全新至宝将拥有额外款式
2019/12/19 DOTA
Python入门篇之编程习惯与特点
2014/10/17 Python
教你用 Python 实现微信跳一跳(Mac+iOS版)
2018/01/04 Python
解决Django的request.POST获取不到内容的问题
2018/05/28 Python
谈谈Python中的while循环语句
2019/03/10 Python
使用PyQt的QLabel组件实现选定目标框功能的方法示例
2020/05/19 Python
python中os包的用法
2020/06/01 Python
CSS3 实现的缩略图悬停效果
2020/12/09 HTML / CSS
HTML5之消息通知的使用(Web Notification)
2018/10/30 HTML / CSS
Debenhams百货英国官方网站:Debenhams UK
2016/07/12 全球购物
We Fashion荷兰:一家国际时装公司
2018/04/18 全球购物
英国最受欢迎的价格比较网站之一:MoneySuperMarket
2018/12/19 全球购物
Myholidays美国:在线旅游网站
2019/08/16 全球购物
Fnac西班牙官网:法国文化和电子产品零售商
2021/03/14 全球购物
使用python绘制分组对比柱状图
2022/04/21 Python
Win11使用CAD卡顿或者致命错误怎么办?Win11无法正常使用CAD的解决方法
2022/07/23 数码科技