# -*- coding:utf-8 -*-
def set_func1(func):
print("set_fun1执行了")
def call_fun(*args, **kwargs):
print("call_fun1执行了")
return func(*args, **kwargs)
return call_fun
def set_func2(func):
print("set_fun2执行了")
def call_fun(*args, **kwargs):
print("call_fun1执行了")
return func(*args, **kwargs)
return call_fun
@set_func2
@set_func1
def test():
return "test is show"
print(test())
代码的执行过程是
1、首先定义了两个装饰器函数set_func1与set_func2,这两个函数都会打印出一句话,并返回一个闭包。
2、接着定义了一个函数test,并给这个函数添加了两个装饰器。Python会首先执行离函数最近的装饰器,也就是set_func1,因此会首先打印出 “set_fun1执行了”。
3、然后返回set_func1的闭包给set_func2,set_func2执行,打印出 “set_fun2执行了”,返回set_func2的闭包给test函数。
4、调用print(test())会执行test函数,这个函数实际上已经被替换成了set_func2的闭包,因此会打印出 “call_fun1执行了”。
5、因为set_func2的闭包中还调用了set_func1的闭包,所以再次打印出 “call_fun1执行了”,然后执行test函数,返回 “test is show”。
所以,执行结果为:
set_fun1执行了
set_fun2执行了
call_fun1执行了
call_fun1执行了
test is show
总结:
1、如果不好理解调用过程,可以记为:由近到远执行装饰器,由远到近执行闭包,最后执行函数;
装饰器1–>装饰器2–>装饰器2的闭包–>装饰器1的闭包–>执行函数