浅谈解除装饰器作用(python3新增)

时间:2018-10-15
今天小编就为大家分享一篇浅谈解除装饰器作用(python3新增),具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧

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

假设装饰器是通过 @wraps 来实现的,那么你可以通过访问 wrapped 属性来访问原始函数:

>>> @somedecorator
>>> def add(x, y):
...  return x + y
...
>>> orig_add = add.__wrapped__
>>> orig_add(3, 4)
7
>>>

如果有多个包装器:

In [588]: from functools import wraps

In [589]: def decorator1(func):
  ...:  @wraps(func)
  ...:  def wrapper(*args, **kwargs):
  ...:   print ('Decorator 1')
  ...:   return func(*args, **kwargs)
  ...:  return wrapper
  ...: 

In [590]: def decorator2(func):
  ...:  @wraps(func)
  ...:  def wrapper(*args, **kwargs):
  ...:   print ('Decorator 2')
  ...:   return func(*args, **kwargs)
  ...:  return wrapper
  ...: 

In [591]: @decorator1
  ...: @decorator2
  ...: def add(x, y):
  ...:  return x+y
  ...: 

In [592]: add(2,3)
Decorator 1
Decorator 2
Out[592]: 5

In [593]: add.__wrapped__(2, 3)
Decorator 2
Out[593]: 5

In [594]: add.__wrapped__.__wrapped__(2,3)
Out[594]: 5

参考:Python Cookbook

以上这篇浅谈解除装饰器作用(python3新增)就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持脚本之家。