# 装饰器一
def check_permission_1(func):
print(1)
def deco1(*args, **kwargs):
print(2)
res = func(*args, **kwargs)
print(3)
return res
print(4)
return deco1
# 装饰器二
def check_permission_2(func):
print(5)
def deco2(*args, **kwargs):
print(6)
res = func(*args, **kwargs)
print(7)
return res
print(8)
return deco2
@check_permission_1
@check_permission_2
def test():
print('hello world')
如上所示,test函数上面嵌套了两层装饰器,那么,它们的层级和运行顺序是怎么样的呢?
首先,装饰器是自下而上运行的。装饰器2装饰了test函数,成为了一个新的函数,然后这个新的函数又被装饰器1装饰了,总的来说,就是这样的结构:
check_permission_1(check_permission_2(test))
那么以上的输出是怎么样呢?如下:
1、装饰器2装饰了test函数,那么就变成了这样的函数:
def check_permission_2(test):
print(5)
def deco2(*args, **kwargs):
print(6)
res = test(*args, **kwargs)
print(7)
return res
print(8)
return deco2
那么,输出顺序必然是 5, 8,接着将deco当做返回值返回外层的装饰器。
2、返回的deco函数被装饰器1装饰,那么就变成这样的函数:
# 装饰器一
def check_permission_1(deco2):
print(1)
def deco1(*args, **kwargs):
print(2)
res = deco2(*args, **kwargs)
print(3)
return res
print(4)
return deco1
那么,输出顺序必然是 1, 4,接着将deco1返回外层装饰器,这时发现外层没有装饰器了,就直接执行deco1
那么这时候输出显然是 2,然后接着执行deco2,输出 6,然后执行test,输出 hello world, 然后输出 7,最后输出3