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代码制作configure文件示例
Jul 28 Python
python批量修改文件名的实现代码
Sep 01 Python
Python实现配置文件备份的方法
Jul 30 Python
Python中字符串格式化str.format的详细介绍
Feb 17 Python
Python File readlines() 使用方法
Mar 19 Python
python实现雨滴下落到地面效果
Jun 21 Python
Python图像处理之图像的读取、显示与保存操作【测试可用】
Jan 04 Python
Tensorflow获取张量Tensor的具体维数实例
Jan 19 Python
检测tensorflow是否使用gpu进行计算的方式
Feb 03 Python
Python数据正态性检验实现过程
Apr 18 Python
class类在python中获取金融数据的实例方法
Dec 10 Python
Python万能模板案例之matplotlib绘制甘特图
Apr 13 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
php调用mysql存储过程
2007/02/14 PHP
用Simple Excel导出xls实现方法
2012/12/06 PHP
php文件上传的例子及参数详解
2013/12/12 PHP
PHP中加密解密函数与DES加密解密实例
2014/10/17 PHP
PHP实现的通过参数生成MYSQL语句类完整实例
2016/04/11 PHP
理解JavaScript中的事件
2006/09/23 Javascript
javascript高级学习笔记整理
2011/08/14 Javascript
js对象关系图 方便dom操作
2012/03/18 Javascript
jQuery中remove()方法用法实例
2014/12/25 Javascript
node.js中的事件处理机制详解
2016/11/26 Javascript
js 文字超出长度用省略号代替,鼠标悬停并以悬浮框显示实例
2016/12/06 Javascript
javaScript+turn.js实现图书翻页效果实例代码
2017/02/16 Javascript
Vue.js 中的 $watch使用方法
2017/05/25 Javascript
使用 Node.js 对文本内容分词和关键词抽取
2017/05/27 Javascript
JS获取填报扩展单元格控件的值的解决办法
2017/07/14 Javascript
vue-resource调用promise取数据方式详解
2017/07/21 Javascript
Node.js如何实现注册邮箱激活功能 (常见)
2017/07/23 Javascript
JS面试题大坑之隐式类型转换实例代码
2018/10/14 Javascript
Vue组件教程之Toast(Vue.extend 方式)详解
2019/01/27 Javascript
python中文乱码的解决方法
2013/11/04 Python
Python查找两个有序列表中位数的方法【基于归并算法】
2018/04/20 Python
python实现点对点聊天程序
2018/07/28 Python
利用python循环创建多个文件的方法
2018/10/25 Python
Python 利用scrapy爬虫通过短短50行代码下载整站短视频
2018/10/29 Python
CentOS 7 安装python3.7.1的方法及注意事项
2018/11/01 Python
Python之使用adb shell命令启动应用的方法详解
2019/01/07 Python
python 实现多线程下载视频的代码
2019/11/15 Python
在pycharm中为项目导入anacodna环境的操作方法
2020/02/12 Python
django 实现后台从富文本提取纯文本
2020/07/02 Python
纯css3显示隐藏一个div特效的具体实现
2014/02/10 HTML / CSS
印度尼西亚最完整和最大的在线药房网站:Farmaku.com
2019/11/23 全球购物
建筑专业自荐信范文
2014/01/05 职场文书
婚前协议书范本
2014/04/15 职场文书
软件项目实施计划书
2014/05/02 职场文书
大学生暑期社会实践的个人总结!
2019/07/17 职场文书
2019年销售部季度工作计划3篇
2019/10/09 职场文书