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中reduce()函数的使用方法示例
Sep 29 Python
简单了解什么是神经网络
Dec 23 Python
Python实现中一次读取多个值的方法
Apr 22 Python
Python3中正则模块re.compile、re.match及re.search函数用法详解
Jun 11 Python
Python3连接SQLServer、Oracle、MySql的方法
Jun 28 Python
Python运维自动化之nginx配置文件对比操作示例
Aug 29 Python
详解python pandas 分组统计的方法
Jul 30 Python
python 递归调用返回None的问题及解决方法
Mar 16 Python
pytorch 中的重要模块化接口nn.Module的使用
Apr 02 Python
Django QuerySet查询集原理及代码实例
Jun 13 Python
PyCharm 2020.2下配置Anaconda环境的方法步骤
Sep 23 Python
详解非极大值抑制算法之Python实现
Jun 28 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中图片等比缩放的实例
2013/03/24 PHP
PHP5函数小全(分享)
2013/06/06 PHP
PHP5中GD库生成图形验证码(有汉字)
2013/07/28 PHP
PHP实现图片旋转效果实例代码
2014/10/01 PHP
PHP实现设计模式中的抽象工厂模式详解
2014/10/11 PHP
PHP可变函数学习小结
2015/11/29 PHP
使用js获取QueryString的方法小结
2010/02/28 Javascript
Jquery带搜索框的下拉菜单
2013/05/06 Javascript
js光标定位文本框回车表单提交问题的解决方法
2015/05/11 Javascript
使用jquery获取url及url参数的简单实例
2016/06/14 Javascript
JavaScript求一组数的最小公倍数和最大公约数常用算法详解【面向对象,回归迭代和循环】
2018/05/07 Javascript
在vue 中使用 less的教程详解
2018/09/26 Javascript
轻量级富文本编辑器wangEditor结合vue使用方法示例
2018/10/10 Javascript
Jquery动态列功能完整实例
2019/08/30 jQuery
vue实现购物车小案例
2019/09/27 Javascript
JavaScript中的this/call/apply/bind的使用及区别
2020/03/06 Javascript
学习python的几条建议分享
2013/02/10 Python
深入学习Python中的上下文管理器与else块
2017/08/27 Python
python命令行参数用法实例分析
2019/06/25 Python
基于django ManyToMany 使用的注意事项详解
2019/08/09 Python
将python文件打包exe独立运行程序方法详解
2020/02/12 Python
Python库安装速度过慢解决方案
2020/07/14 Python
django使用graphql的实例
2020/09/02 Python
Python Pivot table透视表使用方法解析
2020/09/11 Python
Melijoe时尚童装德国官网:Melijoe德国
2016/09/03 全球购物
英国知名美妆护肤在线商城:Zest Beauty
2018/04/24 全球购物
单位未婚证明范本
2014/01/18 职场文书
乡镇干部十八大感言
2014/02/17 职场文书
应急管理培训方案
2014/06/12 职场文书
田径运动会通讯稿
2014/09/13 职场文书
庆元旦演讲稿
2014/09/15 职场文书
2015医德医风个人工作总结
2015/04/02 职场文书
如何使用JavaScript策略模式校验表单
2021/04/29 Javascript
浅谈哪个Python库才最适合做数据可视化
2021/06/28 Python
JS中如何优雅的使用async await详解
2021/10/05 Javascript
浅谈克隆 JavaScript
2021/11/02 Javascript