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 相关文章推荐
35个Python编程小技巧
Apr 01 Python
Python实现希尔排序算法的原理与用法实例分析
Nov 23 Python
Python判断两个对象相等的原理
Dec 12 Python
Python数据结构与算法之使用队列解决小猫钓鱼问题
Dec 14 Python
详解Python安装tesserocr遇到的各种问题及解决办法
Mar 07 Python
python反转列表的三种方式解析
Nov 08 Python
Python PyInstaller库基本使用方法分析
Dec 12 Python
Python3实现打印任意宽度的菱形代码
Apr 12 Python
Jupyter notebook设置背景主题,字体大小及自动补全代码的操作
Apr 13 Python
Python QTimer实现多线程及QSS应用过程解析
Jul 11 Python
利用Python将图片中扭曲矩形的复原
Sep 07 Python
python 如何使用find和find_all爬虫、找文本的实现
Oct 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根据IP地址获取所在城市具体实现
2013/11/27 PHP
php利用ffmpeg提取视频中音频与视频画面的方法详解
2017/06/07 PHP
使javascript也能包含文件
2006/10/26 Javascript
避免 showModalDialog 弹出新窗体的原因分析
2010/05/31 Javascript
jquery移动listbox的值原理及代码
2013/05/03 Javascript
js截取字符串的两种方法及区别详解
2013/11/05 Javascript
教你如何使用PHP输出中文JSON字符串
2014/05/22 Javascript
js控制再次点击按钮之间的间隔时间可防止重复提交
2014/08/01 Javascript
JavaScript中获取样式的原生方法小结
2014/10/08 Javascript
JS实现点击文字对应DIV层不停闪动效果的方法
2015/03/02 Javascript
AngularJS页面访问时出现页面闪烁问题的解决
2016/03/06 Javascript
angularJS Provider、factory、service详解及实例代码
2016/09/21 Javascript
详解javascript立即执行函数表达式IIFE
2017/02/13 Javascript
JS实现禁止高频率连续点击的方法【基于ES6语法】
2017/04/25 Javascript
nodejs批量下载图片的实现方法
2017/05/19 NodeJs
详解a标签添加onclick事件的几种方式
2019/03/29 Javascript
VUE实现强制渲染,强制更新
2019/10/29 Javascript
[55:02]2014 DOTA2国际邀请赛中国区预选赛 HGT VS Orenda
2014/05/21 DOTA
[03:04]2018年国际邀请赛典藏宝瓶&莱恩声望物品展示 片尾有彩蛋
2018/06/04 DOTA
仅利用30行Python代码来展示X算法
2015/04/01 Python
python3.5绘制随机漫步图
2018/08/27 Python
python numpy 按行归一化的实例
2019/01/21 Python
django 使用 PIL 压缩图片的例子
2019/08/16 Python
Python selenium文件上传下载功能代码实例
2020/04/13 Python
Python使用Pyqt5实现简易浏览器(最新版本测试过)
2020/04/27 Python
keras 简单 lstm实例(基于one-hot编码)
2020/07/02 Python
HTML5 本地存储之如果没有数据库究竟会怎样
2013/04/25 HTML / CSS
基于html5实现的图片墙效果
2014/10/16 HTML / CSS
如何现实servlet的单线程模式
2014/08/05 面试题
简历自荐信
2013/12/02 职场文书
销售提升方案
2014/06/07 职场文书
中学生思想品德评语
2014/12/31 职场文书
初中英语教师个人工作总结2015
2015/07/21 职场文书
多人股份制合作协议书
2016/03/19 职场文书
python tkinter实现定时关机
2021/04/21 Python
nginx作grpc的反向代理踩坑总结
2021/07/07 Servers