解除一个装饰器-问答-阿里云开发者社区-阿里云

开发者社区> 问答> 正文

解除一个装饰器

2020-04-17 16:00:15 841 2

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

取消 提交回答
全部回答(2)
  • 景凌凯
    2020-04-17 17:45:10
    
    如果有多个包装器,那么访问 __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__ 中)。
    
    0 0
  • 哦哦喔
    2020-04-17 16:00:24
    假设装饰器是通过 @wraps (参考9.2小节)来实现的,那么你可以通过访问 __wrapped__ 属性来访问原始函数:
    
    >>> @somedecorator
    >>> def add(x, y):
    ...     return x + y
    ...
    >>> orig_add = add.__wrapped__
    >>> orig_add(3, 4)
    7
    >>>
    
    0 0
添加回答
相关问答

1

回答

简单模式 下线是不是只能删除

2022-08-03 15:24:52 59浏览量 回答数 1

1

回答

怎么删除一个节点,和返回被删除的节点?

2022-03-29 22:57:06 251浏览量 回答数 1

1

回答

解除解析暂停

2018-09-15 17:43:49 437浏览量 回答数 1

2

回答

解除端口

2018-08-23 09:32:20 337浏览量 回答数 2

1

回答

信任付这个已经解除了,还是一直提示

2018-05-05 02:57:48 1094浏览量 回答数 1

1

回答

快照被删除

2018-03-16 01:08:34 604浏览量 回答数 1

1

回答

如何才能删除掉快照

2018-03-06 01:03:03 448浏览量 回答数 1

1

回答

风云令如何解除绑定

2016-11-17 11:42:38 3529浏览量 回答数 1

1

回答

一个bug。。。

2015-05-21 22:06:39 3117浏览量 回答数 1

1

回答

解除手机绑定

2015-01-20 11:36:59 3605浏览量 回答数 1
+关注
0
文章
446
问答
问答排行榜
最热
最新
相关电子书
更多
低代码开发师(初级)实战教程
立即下载
阿里巴巴DevOps 最佳实践手册
立即下载
冬季实战营第三期:MySQL数据库进阶实战
立即下载