Python如何解除一个装饰器

 更新时间:2020年08月07日 11:24:52   作者:David Beazley  
这篇文章主要介绍了Python如何解除一个装饰器,帮助大家更好的理解和学习Python装饰器,感兴趣的朋友可以了解下
(福利推荐:【腾讯云】服务器最新限时优惠活动,云服务器1核2G仅99元/年、2核4G仅768元/3年,立即抢购>>>:9i0i.cn/qcloud

(福利推荐:你还在原价购买阿里云服务器?现在阿里云0.8折限时抢购活动来啦!4核8G企业云服务器仅2998元/3年,立即抢购>>>:9i0i.cn/aliyun

问题

一个装饰器已经作用在一个函数上,你想撤销它,直接访问原始的未包装的那个函数。

解决方案

假设装饰器是通过 @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网络爬虫框架scrapy

    关于Python网络爬虫框架scrapy

    这篇文章主要介绍了关于Python网络爬虫框架scrapy,爬虫框架是实现爬虫功能的一个软件结构和功能组件的集合,需要的朋友可以参考下
    2023-04-04
  • Python虚拟机字节码教程之装饰器实现详解

    Python虚拟机字节码教程之装饰器实现详解

    在本篇文章当中主要给大家介绍在?cpython?当中一些比较常见的字节码,从根本上理解?python?程序的执行。在本文当中主要介绍一些?python?基本操作的字节码,并且将从字节码的角度分析函数装饰器的原理
    2023-04-04
  • Python3利用SMTP协议发送E-mail电子邮件的方法

    Python3利用SMTP协议发送E-mail电子邮件的方法

    SMTP(Simple Mail Transfer Protocol)即简单邮件传输协议,它是一组用于由源地址到目的地址传送邮件的规则,由它来控制信件的中转方式。下面这篇文章主要给大家介绍了关于Python3如何利用SMTP协议发送E-mail电子邮件的方法,需要的朋友可以参考下。
    2017-09-09
  • Python图像运算之顶帽运算和底帽运算详解

    Python图像运算之顶帽运算和底帽运算详解

    数学形态学是应用于图像处理和模式识别领域的新方法。数学形态学表示以形态为基础对图像进行分析的数学工具,基本思想是用具有一定形态的结构元素去量度和提取图像中对应形状以达到对图像分析和识别的目的。本文将为大家介绍顶帽运算和底帽运算,需要的可以参考一下
    2022-07-07
  • PyTorch: Softmax多分类实战操作

    PyTorch: Softmax多分类实战操作

    这篇文章主要介绍了PyTorch: Softmax多分类实战操作,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2020-07-07
  • Python IDLE或shell中切换路径的操作

    Python IDLE或shell中切换路径的操作

    这篇文章主要介绍了Python IDLE或shell中切换路径的操作,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2020-03-03
  • 聊聊python中的load、loads实现反序列化的问题

    聊聊python中的load、loads实现反序列化的问题

    在python自动化中,我们传递一些参数是需要从文件中读取过来的,读取过来的字典并非python对象数据类型而是string类型。本文给大家分享python中的load、loads实现反序列化的问题,感兴趣的朋友一起看看吧
    2021-10-10
  • python进度条显示-tqmd模块的实现示例

    python进度条显示-tqmd模块的实现示例

    这篇文章主要介绍了python进度条显示-tqmd模块的实现示例,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2020-08-08
  • python实现播放音频和录音功能示例代码

    python实现播放音频和录音功能示例代码

    这篇文章主要给大家介绍了关于python播放音频和录音的相关资料,文中通过示例代码介绍的非常详细,对大家学习或者使用python具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2018-12-12
  • Python打包成exe文件的详细操作指南

    Python打包成exe文件的详细操作指南

    Python越来越被大家所关注,随着越来越多的人开始学习Python代码大家其实或多或少都会遇到一些问题,下面这篇文章主要给大家介绍了关于Python打包成exe文件的详细操作,需要的朋友可以参考下
    2022-06-06

最新评论

?


http://www.vxiaotou.com