Python如何解除一个装饰器


Posted in Python onAugust 07, 2020

问题

一个装饰器已经作用在一个函数上,你想撤销它,直接访问原始的未包装的那个函数。

解决方案

假设装饰器是通过 @wraps 来实现的,那么你可以通过访问 __wrapped__ 属性来访问原始函数:

>>> @somedecorator
>>> def add(x, y):
...   return x + y
...
>>> orig_add = add.__wrapped__
>>> orig_add(3, 4)
7
>>>

讨论

直接访问未包装的原始函数在调试、内省和其他函数操作时是很有用的。 但是我们这里的方案仅仅适用于在包装器中正确使用了 @wraps 或者直接设置了 __wrapped__ 属性的情况。

如果有多个包装器,那么访问 __wrapped__ 属性的行为是不可预知的,应该避免这样做。 在Python3.3中,它会略过所有的包装层,比如,假如你有如下的代码:

from functools import wraps

def decorator1(func):
  @wraps(func)
  def wrapper(*args, **kwargs):
    print('Decorator 1')
    return func(*args, **kwargs)
  return wrapper

def decorator2(func):
  @wraps(func)
  def wrapper(*args, **kwargs):
    print('Decorator 2')
    return func(*args, **kwargs)
  return wrapper

@decorator1
@decorator2
def add(x, y):
  return x + y

下面我们在Python3.3下测试:

>>> add(2, 3)
Decorator 1
Decorator 2
5
>>> add.__wrapped__(2, 3)
5
>>>

下面我们在Python3.4下测试:

>>> add(2, 3)
Decorator 1
Decorator 2
5
>>> add.__wrapped__(2, 3)
Decorator 2
5
>>>

最后要说的是,并不是所有的装饰器都使用了 @wraps ,因此这里的方案并不全部适用。 特别的,内置的装饰器 @staticmethod @classmethod 就没有遵循这个约定 (它们把原始函数存储在属性 __func__ 中)。

以上就是Python如何解除一个装饰器的详细内容,更多关于Python 解除装饰器的资料请关注三水点靠木其它相关文章!

Python 相关文章推荐
详解Python的单元测试
Apr 28 Python
Pandas 数据处理,数据清洗详解
Jul 10 Python
使用tensorflow实现线性svm
Sep 07 Python
python使用Matplotlib画条形图
Mar 25 Python
由Python编写的MySQL管理工具代码实例
Apr 09 Python
Python 常用模块 re 使用方法详解
Jun 06 Python
python判断单向链表是否包括环,若包含则计算环入口的节点实例分析
Oct 23 Python
使用tensorboard可视化loss和acc的实例
Jan 21 Python
jupyter 使用Pillow包显示图像时inline显示方式
Apr 24 Python
简单了解Java Netty Reactor三种线程模型
Apr 26 Python
如何快速理解python的垃圾回收机制
Sep 01 Python
python中的sys模块和os模块
Mar 20 Python
解决Pycharm双击图标启动不了的问题(JetBrains全家桶通用)
Aug 07 #Python
Python实现上下文管理器的方法
Aug 07 #Python
Python 读取位于包中的数据文件
Aug 07 #Python
Python如何绘制日历图和热力图
Aug 07 #Python
Pycharm2020.1安装无法启动问题即设置中文插件的方法
Aug 07 #Python
手把手教你如何用Pycharm2020.1.1配置远程连接的详细步骤
Aug 07 #Python
Pycharm2020.1安装中文语言插件的详细教程(不需要汉化)
Aug 07 #Python
You might like
中国的第一台收音机
2021/03/01 无线电
跟我学Laravel之路由
2014/10/15 PHP
jquery validate.js表单验证的基本用法入门
2010/05/13 Javascript
jquery插件qrcode在线生成二维码
2015/04/26 Javascript
javascript实现验证身份证号的有效性并提示
2015/04/30 Javascript
详细介绍jQuery.outerWidth() 函数具体用法
2015/07/20 Javascript
纯javascript移动优先的幻灯片效果
2015/11/02 Javascript
jQuery学习心得总结(必看篇)
2016/06/10 Javascript
javascript另类方法实现htmlencode()与htmldecode()函数实例分析
2016/11/17 Javascript
angularjs定时任务的设置与清除示例
2017/06/02 Javascript
vue.js项目中实用的小技巧汇总
2017/11/29 Javascript
vue项目打包后打开页面空白解决办法
2018/06/29 Javascript
jquery ajax加载数据前台渲染方式 不用for遍历的方法
2018/08/09 jQuery
对vue 键盘回车事件的实例讲解
2018/08/25 Javascript
elementUI select组件默认选中效果实现的方法
2019/03/25 Javascript
小程序获取当前位置加搜索附近热门小区及商区的方法
2019/04/08 Javascript
vue之a-table中实现清空选中的数据
2019/11/07 Javascript
python网络编程之读取网站根目录实例
2014/09/30 Python
python使用BeautifulSoup分页网页中超链接的方法
2015/04/04 Python
python抓取网页中图片并保存到本地
2015/12/01 Python
详解Python函数作用域的LEGB顺序
2016/05/14 Python
python字典的常用方法总结
2019/07/31 Python
python excel转换csv代码实例
2019/08/26 Python
解决pyshp UnicodeDecodeError的问题
2019/12/06 Python
python代码实现将列表中重复元素之间的内容全部滤除
2020/05/22 Python
Keras在训练期间可视化训练误差和测试误差实例
2020/06/16 Python
python+django+selenium搭建简易自动化测试
2020/08/19 Python
HTML5 Canvas中绘制矩形实例
2015/01/01 HTML / CSS
软件测试笔试题
2012/10/25 面试题
学前教育专业毕业生自荐信
2013/10/03 职场文书
找工作最新求职信
2013/12/22 职场文书
农民致富事迹材料
2014/01/23 职场文书
乡党委干部党的群众路线教育实践活动个人对照检查材料思想汇报
2014/10/01 职场文书
初中作文评语集锦
2014/12/25 职场文书
2016年秋季趣味运动会开幕词
2016/03/04 职场文书
MySQL查询日期时间
2022/05/15 MySQL