Python 多装饰器的执行顺序

当有多个装饰器时的执行过程

Posted by mengxun on July 1, 2019

定义

首先定义两个简单的装饰器和一个被装饰的函数,代码如下:

def wrap1(func):
	print("wrap1-1")
	def call1():
		print("wrap1-2")
		func()
	return call1


def wrap2(func):
	print("wrap2-1")
	def call2():
		print("wrap2-2")
		func()
	return call2
	
@wrap2
@wrap1
def func():
	print("func")

执行结果

执行上述代码,会打印出如下结果:

>>> func()
wrap1-1
wrap2-1
wrap2-2
wrap1-2
func

过程

在Python里,当多个装饰器装饰同一个对象时,执行顺序是由里向外的。

比如在这个例子里的 func() 的解析过程就相当于:

func() ==> wrap2(wrap1(func))() ==> wrap2(call1)() ==> call2() ==> call1() ==> func()

细心点的话,就可以看出上面的每一行输出结果,其实都对应这里的每一步执行过程。