python多装饰器的执行顺序
-
def outer(func):
"""
自定义逻辑1
"""
def inner(*args,**kwargs):
"""
自定义逻辑2
"""
res = func(*args,**kwargs)
"""
自定义逻辑3
"""
return res
return inner -
装饰器装饰原理
-
多个装饰器执行顺序
当func有多个装饰器时,装饰器会按照从下到上的顺序对func进行装饰,也就是最靠近函数的装饰器最先应用装饰,应用装饰的时候会执行装饰器的"自定义逻辑1"。
最下层装饰器装饰func并返回自己的inner方法,那么上一层的装饰器就会装饰下层装饰器的inner方法,并返回自己的inner方法,以此类推。
# 从下到上给装饰器编号1~n
func = outer_n(
outer_n-1(
outer_n-2(
...(
outer_1(func)
)
)
)
)
此时func指向的就是最上层装饰器的inner方法。
所以当func被执行时,最先被执行的逻辑是最上层装饰器的"自定义逻辑2",然后是下一层装饰器的"自定义逻辑2",以此类推。
直到执行完原始的func之后,开始执行最下层装饰器的"自定义逻辑3",然后是上一层装饰器的"自定义逻辑3",以此类推。 - 示例:
def outer(func): print("1") def inner(*args, **kwargs): print("2") res = func(*args, **kwargs) print("3") return res print("4") return inner def outer1(func): print("5") def inner(*args, **kwargs): print("6") res = func(*args, **kwargs) print("7") return res print("8") return inner @outer1 @outer def test(): pass test()
# 输出:
1
4
5
8
6
2
3
7