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中MySQLdb和torndb模块对MySQL的断连问题处理
Nov 09 Python
最大K个数问题的Python版解法总结
Jun 16 Python
python爬虫入门教程--HTML文本的解析库BeautifulSoup(四)
May 25 Python
浅谈numpy中linspace的用法 (等差数列创建函数)
Jun 07 Python
Python自动化运维之IP地址处理模块详解
Dec 10 Python
python获取文件路径、文件名、后缀名的实例
Apr 23 Python
python生成器推导式用法简单示例
Oct 08 Python
python如何实现不用装饰器实现登陆器小程序
Dec 14 Python
pytorch下使用LSTM神经网络写诗实例
Jan 14 Python
关于matplotlib-legend 位置属性 loc 使用说明
May 16 Python
Python实现简单猜数字游戏
Feb 03 Python
python中 .npy文件的读写操作实例
Apr 14 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 中文处理函数集合
2008/08/27 PHP
php实现可用于mysql,mssql,pg数据库操作类
2014/12/13 PHP
php curl常用的5个经典例子
2017/01/20 PHP
关于Curl在Swoole协程中的解决方案详析
2019/09/12 PHP
各种效果的jquery ui(接口)介绍
2008/09/17 Javascript
setTimeout与setInterval在不同浏览器下的差异
2010/01/24 Javascript
jquery聚焦文本框与扩展文本框聚焦方法
2012/10/12 Javascript
js跑步算法的实现代码
2013/12/04 Javascript
js转化毫秒为时间格式代码
2014/04/10 Javascript
jQuery 1.9使用$.support替代$.browser的使用方法
2014/05/27 Javascript
Node.js文件操作详解
2014/08/16 Javascript
Javascript 拖拽的一些简单的应用(逐行分析代码,让你轻松了拖拽的原理)
2015/01/23 Javascript
javascript数组去重的方法汇总
2015/04/14 Javascript
JS实现带有抽屉效果的产品类网站多级导航菜单代码
2015/09/15 Javascript
JQuery页面随滚动条动态加载效果的简单实现(推荐)
2017/02/08 Javascript
vue 组件 全局注册和局部注册的实现
2018/02/28 Javascript
详解Vue.js使用Swiper.js在iOS
2018/09/10 Javascript
[01:15:18]2014 DOTA2国际邀请赛中国区预选赛 LGD VS Speed Gaming.cn
2014/05/22 DOTA
[49:28]VP vs Optic 2018国际邀请赛小组赛BO2 第二场 8.16
2018/08/17 DOTA
python采用requests库模拟登录和抓取数据的简单示例
2014/07/05 Python
python 中的list和array的不同之处及转换问题
2018/03/13 Python
一份python入门应该看的学习资料
2018/04/11 Python
python实现决策树ID3算法的示例代码
2018/05/30 Python
python word转pdf代码实例
2019/08/16 Python
django中瀑布流写法实例代码
2019/10/14 Python
百联网上商城:i百联
2017/01/28 全球购物
Ted Baker英国官网:男士和女士服装及配件
2017/03/13 全球购物
安全的后院和健身蹦床:JumpSport
2019/07/15 全球购物
生物科学系大学生的自我评价
2013/12/20 职场文书
策划总监岗位职责
2014/02/16 职场文书
水利水电建筑施工应届生求职信
2014/07/04 职场文书
创先争优演讲稿
2014/09/15 职场文书
董事长秘书岗位职责
2015/02/13 职场文书
《平移和旋转》教学反思
2016/02/19 职场文书
导游词之铁岭象牙山
2019/12/06 职场文书
不想升级Win11?教你彻底锁定老版Windows系统的方法(附下载地址)
2022/09/23 数码科技