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 相关文章推荐
pyqt4教程之widget使用示例分享
Mar 07 Python
python读写二进制文件的方法
May 09 Python
python+VTK环境搭建及第一个简单程序代码
Dec 13 Python
详解Python中如何写控制台进度条的整理
Mar 07 Python
Python集中化管理平台Ansible介绍与YAML简介
Jun 12 Python
python中pygame安装过程(超级详细)
Aug 04 Python
Django media static外部访问Django中的图片设置教程
Apr 07 Python
Python中flatten( ),matrix.A用法说明
Jul 05 Python
Pycharm操作Git及GitHub的步骤详解
Oct 27 Python
python获取天气接口给指定微信好友发天气预报
Dec 28 Python
解决pycharm不能自动保存在远程linux中的问题
Feb 06 Python
Python超详细分步解析随机漫步
Mar 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
Zerg建筑一览
2020/03/14 星际争霸
Search Engine Friendly的URL设计
2006/10/09 PHP
PHP版网站缓存加快打开速度的方法分享
2012/06/03 PHP
PHP调用VC编写的COM组件实例
2014/03/29 PHP
PHP5.2下preg_replace函数的问题
2015/05/08 PHP
php将图片文件转换成二进制输出的方法
2015/06/10 PHP
PHP仿微信发红包领红包效果
2016/10/30 PHP
php加密之discuz内容经典加密方式实例详解
2017/02/04 PHP
jquery.validate使用攻略 第五步 正则验证
2010/07/01 Javascript
基于JQuery制作的产品广告效果
2010/12/08 Javascript
不用构造函数(Constructor)new关键字也能实现JavaScript的面向对象
2013/01/11 Javascript
jquery实现隐藏与显示动画效果/输入框字符动态递减/导航按钮切换
2013/07/01 Javascript
在AngularJS中使用AJAX的方法
2015/06/17 Javascript
新手学习前端之js模仿淘宝主页网站
2016/10/31 Javascript
微信公众号开发 实现点击返回按钮就返回到聊天界面
2016/12/15 Javascript
js图片轮播手动切换特效
2017/01/12 Javascript
Vue项目中引入外部文件的方法(css、js、less)
2017/07/24 Javascript
vue2利用Bus.js如何实现非父子组件通信详解
2017/08/25 Javascript
React Native基础入门之调试React Native应用的一小步
2018/07/02 Javascript
JS事件绑定的常用方式实例总结
2019/03/02 Javascript
vue实现禁止浏览器记住密码功能的示例代码
2021/02/03 Vue.js
python学习手册中的python多态示例代码
2014/01/21 Python
Centos7 Python3下安装scrapy的详细步骤
2018/03/15 Python
python 自动去除空行的实例
2018/07/24 Python
Django中使用Celery的教程详解
2018/08/24 Python
Python读取指定日期邮件的实例
2019/02/01 Python
不到40行代码用Python实现一个简单的推荐系统
2019/05/10 Python
python pandas生成时间列表
2019/06/29 Python
波兰在线体育用品商店:Hop-Sport.pl
2019/07/23 全球购物
Footshop罗马尼亚:最好的运动鞋选择
2019/09/10 全球购物
摄影实习自我鉴定
2013/09/20 职场文书
制冷与空调专业毕业生推荐信
2014/07/07 职场文书
励志演讲稿3分钟
2014/08/21 职场文书
公司合并协议书范本
2014/09/30 职场文书
Nginx配置文件详解以及优化建议指南
2021/09/15 Servers
python playwright 自动等待和断言详解
2021/11/27 Python