欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

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

程序员文章站 2024-02-03 12:11:28
一个装饰器已经作用在一个函数上,你想撤销它,直接访问原始的未包装的那个函数。 假设装饰器是通过 @wraps 来实现的,那么你可以通过访问 wrapped 属性来访问原始...

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

假设装饰器是通过 @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新增)就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持。