当我们将装饰器(@A)应用在一个函数(B1)上时,其实结果就是创建一个新的函数,B2=@A(B1) 。
@A
def B():
pass
装饰器直接卸载函数前,内部发生的过程是:
def B1():
pass
B2=A(B) #装饰器修改函数定义,然后创建一个新的函数。
不带参数的装饰器
import functools, logging, sys
logging.basicConfig(stream=sys.stderr, level=logging.DEBUG)
def debug(function):
@functools.wraps( function)
def loggen_function(args, **kwargs):
logging.debug("%s(%r ,%r)", function.name, args, kwargs)
result = function(args, **kwargs)
logging.debug("%s == %r", function.name, result)
return result
return loggen_function
@debug
def ackermann(m, n):
if m == 0: return n+1
elif m > 0 and n == 0:
return ackermann(m-1, n)
elif m > 0 and n > 0:
return ackermann(m-1, ackermann(m, n-1))
print(ackermann(2, 4))
带参数的装饰器
@A(arg)
def B():
pass
内部发生的过程是:
def B():
pass
B=A(arg)(B)
例:
def decorator(config):
def concrete_decorator(function):
@functools.wraps(function)
def wtapped(args, **kwargs):
return function(args, **kwargs)
return wtapped
return concrete_decorator