转自:https://www.cnblogs.com/astropeak/p/9029104.html
装饰器例
def copy_to_clipboard_wrap(func):
@wraps(func)
def wrapper(*args, **kwargs):
rtn = func(*args, **kwargs)
Util.copy_to_clipboard(rtn)
return rtn
from functools import wraps
def trace(name):
def wrapper(func):
@wraps(func) #名称修正
def wrapped(*args, **kwargs):
print('Enter %s. Args: %s, kwargs: %s' % (name, args, kwargs))
rv = func(*args, **kwargs)
print('Exit %s. Return value: %s' % (name, rv))
return rv
return wrapped
return wrapper
@trace('area')
def area(height, width):
print('area called')
return height * width
area(2, 3)
结果为
Enter area. Args: (2, 3), kwargs: {}
area called
Exit area. Return value: 6
多重装饰
@decSec
@decFir
def foo():pass
等价于:
def foo():pass
foo = decFir(foo)
foo = decSec(foo)