python支持装饰器嵌套,即多个装饰器装饰同一个函数或方法。
用法
@a_deco
@b_deco
@c_deco
def test_nest_deco():
pass
描述
@a_deco、@b_deco、@c_deco分别占一行,编写在同一个函数或方法的def语句上方。
从def开始,由近到远,依次执行装饰器@c_deco、@b_deco、@c_deco。
等价于
test_nest_deco=a_deco(b_deco(c_deco(test_nest_deco))))
示例
>>> def a_decorator(func):
print('a_decorator 被调用')
return func
>>> def b_decorator(func):
print('b_decorator 被调用')
return func
>>> def c_decorator(func):
print('c_decorator 被调用')
return func
>>> @a_decorator
@b_decorator
@c_decorator
def test_nest_deco():
print('test_nest_deco 被调用')
c_decorator 被调用
b_decorator 被调用
a_decorator 被调用
>>> test_nest_deco()
test_nest_deco 被调用
描述
装饰器的包装函数,比如a_wrapper(),保存接收到的入参函数,以便包装器调用。
最后执行的包装器a_decorator(),会将返回的包装器a_wrapper赋值给主函数变量名test_nest_deco。
调用主函数test_nest_deco()时,相当于调用最后的包装器a_wrapper()。
示例
>>> def a_decorator(func):
print('a_decorator 被调用')
def a_wrapper():
print(func.__name__.center(50,'='))
func()
return '返回 a_decorator'
return a_wrapper
>>> def b_decorator(func):
print('b_decorator 被调用')
def b_wrapper():
print(func.__name__.center(50,'='))
func()
return '返回 b_decorator'
return b_wrapper
>>> def c_decorator(func):
print('c_decorator 被调用')
def c_wrapper():
print(func.__name__.center(50,'='))
func()
return '返回 c_decorator'
return c_wrapper
>>> @a_decorator
@b_decorator
@c_decorator
def test_nest_deco():
print('test_nest_deco 被调用')
c_decorator 被调用
b_decorator 被调用
a_decorator 被调用
>>> test_nest_deco()
====================b_wrapper=====================
====================c_wrapper=====================
==================test_nest_deco==================
test_nest_deco 被调用
'返回 a_decorator'
>>> test_nest_deco.__name__
'a_wrapper'