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程序设计入门(1)基本语法简介
Jun 13 Python
python数据类型判断type与isinstance的区别实例解析
Oct 31 Python
详谈python在windows中的文件路径问题
Apr 28 Python
python TKinter获取文本框内容的方法
Oct 11 Python
Python爬虫实战之12306抢票开源
Jan 24 Python
VSCode Python开发环境配置的详细步骤
Feb 22 Python
分析运行中的 Python 进程详细解析
Jun 22 Python
python绘制双Y轴折线图以及单Y轴双变量柱状图的实例
Jul 08 Python
python图形绘制奥运五环实例讲解
Sep 14 Python
解决Pycharm的项目目录突然消失的问题
Jan 20 Python
Python道路车道线检测的实现
Jun 27 Python
Python 中 Shutil 模块详情
Nov 11 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
在JavaScript中调用php程序
2009/03/09 PHP
iis6手工创建网站后无法运行php脚本的解决方法
2017/06/08 PHP
php实现解析xml并生成sql语句的方法
2018/02/03 PHP
Laravel多用户认证系统示例详解
2018/03/13 PHP
laravel框架select2多选插件初始化默认选中项操作示例
2020/02/18 PHP
js window.event对象详尽解析
2009/02/17 Javascript
javascript 伪数组实现方法
2010/10/11 Javascript
克隆javascript对象的三个方法小结
2011/01/12 Javascript
关于JQuery($.load)事件的用法和分析
2013/04/09 Javascript
JS验证日期的格式YYYY-mm-dd 具体实现
2013/06/29 Javascript
JS 实现BASE64_ENCODE和BASE64_DECODE(实例代码)
2013/11/13 Javascript
javascript简单实现表格行间隔显示颜色并高亮显示
2013/11/29 Javascript
extjs 分页使用jsp传递数据示例
2014/07/29 Javascript
jQuery自定义添加"$"与解决"$"冲突的方法
2015/01/19 Javascript
学习javascript面向对象 理解javascript原型和原型链
2016/01/04 Javascript
JavaScript提高网站性能优化的建议(二)
2016/07/24 Javascript
jQuery实现智能判断固定导航条或侧边栏的方法
2016/09/04 Javascript
JS 获取HTML标签内的子节点的方法
2016/09/21 Javascript
jquery Banner轮播选项卡
2016/12/26 Javascript
前端开发必知的15个jQuery小技巧
2017/01/22 Javascript
JavaScript门面模式详解
2017/10/19 Javascript
微信小程序实现action-sheet弹出底部菜单功能【附源码下载】
2017/12/09 Javascript
vuex + axios 做登录验证 并且保存登录状态的实例
2018/09/16 Javascript
使用FormData实现上传多个文件
2018/12/04 Javascript
在vue-cli中引入lodash.js并使用详解
2019/11/13 Javascript
微信小程序开发(二):页面跳转并传参操作示例
2020/06/01 Javascript
[39:21]LGD vs OG 2019国际邀请赛淘汰赛 胜者组 BO3 第二场 8.24
2019/09/10 DOTA
详谈Python3 操作系统与路径 模块(os / os.path / pathlib)
2018/04/26 Python
python使用opencv对图像mask处理的方法
2019/07/05 Python
解决python有时候import不了当前的包问题
2019/08/28 Python
python中count函数知识点浅析
2020/12/17 Python
初级会计求职信范文
2014/02/15 职场文书
中学生教师节演讲稿
2014/09/03 职场文书
帝企鹅日记观后感
2015/06/10 职场文书
医院中层管理人员培训心得体会
2016/01/11 职场文书
Winsows11性能如何? win11性能测评多核竟比Win10差了10%
2021/11/21 数码科技