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使用正则表达式检测密码强度源码分享
Jun 11 Python
python中sys.argv参数用法实例分析
May 20 Python
Python实现把数字转换成中文
Jun 29 Python
Django中对数据查询结果进行排序的方法
Jul 17 Python
详解字典树Trie结构及其Python代码实现
Jun 03 Python
对pandas的行列名更改与数据选择详解
Nov 12 Python
Python 分享10个PyCharm技巧
Jul 13 Python
基于Django静态资源部署404的解决方法
Jul 28 Python
详解Python打包分发工具setuptools
Aug 05 Python
解决pycharm下pyuic工具使用的问题
Apr 08 Python
Pytorch环境搭建与基本语法
Jun 03 Python
python中pd.cut()与pd.qcut()的对比及示例
Jun 16 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下使用SMTP发邮件的代码
2008/01/10 PHP
如何使用php判断所处服务器操作系统的类型
2013/06/20 PHP
解析Win7 XAMPP apache无法启动的问题
2013/06/26 PHP
ThinkPHP控制器里javascript代码不能执行的解决方法
2014/11/22 PHP
php pdo连接数据库操作示例
2019/11/18 PHP
js控制input框只读实现示例
2014/01/20 Javascript
jquery Validation表单验证使用详解
2020/09/12 Javascript
jqGrid 学习笔记整理——进阶篇(一 )
2016/04/17 Javascript
jquery 判断selection range 是否在容器中的简单实例
2016/08/02 Javascript
javascript实现的图片预览功能
2017/03/25 Javascript
js 去掉字符串前后空格实现代码集合
2017/03/25 Javascript
jQuery扩展_动力节点Java学院整理
2017/07/05 jQuery
浅谈ECMAScript6新特性之let、const
2017/08/02 Javascript
jQuery 改变P标签文本值方法
2018/02/24 jQuery
vue中如何去掉空格的方法实现
2018/11/09 Javascript
Vue3.0结合bootstrap创建多页面应用
2019/05/28 Javascript
解决vue语法会有延迟加载显现{{xxx}}的问题
2019/11/14 Javascript
vue实现表单未编辑或未保存离开弹窗提示功能
2020/04/08 Javascript
如何将Node.js中的回调转换为Promise
2020/11/10 Javascript
Python urlopen 使用小示例
2008/09/06 Python
Python基于动态规划算法计算单词距离
2015/07/25 Python
Python实现自动为照片添加日期并分类的方法
2017/09/30 Python
详解Python之unittest单元测试代码
2018/01/24 Python
Python爬虫框架Scrapy实例代码
2018/03/04 Python
Python OpenCV实现鼠标画框效果
2020/08/19 Python
Keras中的两种模型:Sequential和Model用法
2020/06/27 Python
在pycharm中文件取消用 pytest模式打开的操作
2020/09/01 Python
Python: glob匹配文件的操作
2020/12/11 Python
K近邻法(KNN)相关知识总结以及如何用python实现
2021/01/28 Python
什么是Web Service?
2012/07/25 面试题
外贸主管求职简历的自我评价
2013/10/23 职场文书
经贸日语专业个人求职信
2013/12/13 职场文书
11月升旗仪式讲话稿
2014/02/15 职场文书
会计系毕业生求职信
2014/05/28 职场文书
房地产销售员岗位职责
2015/04/11 职场文书
英文投诉信格式
2015/07/03 职场文书