import functools
def decorator_a(func):
print 'Get in decorator_a'
@functools.wraps(func)
def inner_a(*args, **kwargs):
print 'Get in inner_a'
return func(*args, **kwargs)
return inner_a
def decorator_b(func):
print 'Get in decorator_b'
@functools.wraps(func)
def inner_b(*args, **kwargs):
print 'Get in inner_b'
return func(*args, **kwargs)
return inner_b
def test(a):
print a
def decorator_c(func):
print 'Get in decorator_c'
@functools.wraps(func)
def inner_c(*args, **kwargs):
print 'Get in inner_c'
return func(*args, **kwargs)
return inner_c
return decorator_c
def log(text):
print text
def decorator(func):
print 'log_out'
@functools.wraps(func)
def wrapper(*args, **kw):
print 'log_in'
return func(*args, **kw)
return wrapper
return decorator
@test('a')
@decorator_b
@decorator_a
@log('execute')
def f(x):
print 'Get in f'
return x * 2
f(1)
结果:
a
execute
log_out
Get in decorator_a
Get in decorator_b
Get in decorator_c
Get in inner_c
Get in inner_b
Get in inner_a
log_in
Get in f
规则:由下而上再由上而下,有参数的由上而下