def deco1(func):
print("In deco1, not in fun")
def deco1Fun():
print("in deco1, in fun start")
func()
print("deco1 fun end")
return deco1Fun
def deco2(func):
print("in deco2, not in fun")
def deco2Fun():
print("in deco2, in fun start")
func()
print("deco2 fun end")
return deco2Fun
@deco1
@deco2
def func():
print("func is called")
func()
输出:
也就是说各语句的执行顺序为:
1、deco1寻找自己周围的函数,没有找到。
"""
@deco
def func():
pass
func() # 我的理解应该是:先更改func,即func = deco(func), 把func传入deco, 此时并没有执行函数,然后func() 执行更改后的函数。然后往下看
"""
2、deco2寻找自己周围的函数,找到了,是func, 那么就把func作为参数传入(此时还没有执行func函数)
3、现在进入了deco2(func), func为主函数中的函数被传入,那么就会执行1号语句(上图红1标出的语句),然后注意下方是函数的定义(deco2内部的deco2Fun(), 这个函数内部的fun()函数为deco2的参数,就是主函数传进来的func),此时没有执行deco2内部的deco2Fun, 也没有deco2Fun内部的语句(包括内部的fun :主函数的func函数),把deco2内部的deco2Fun返回,此时还是没有执行函数。
4、deco2结束,此时相当于在@deco1的下方“出现了”一个函数(刚刚deco2返回的deco2内部的deco2Fun),那么此时@deco1周围就相当于出现了函数。那么deco1就把这个函数(deco2内部的deoc2Fun)作为参数传入(deco1)
5、现在进入了deco1(deoc2Fun),那么执行2号语句,下方又是一个函数的定义,这个函数(deco1内部的deco1Fun)内有一个func函数的执行,这个函数是deco1传入的参数,也就是deco2内部的deco2Fun, (还是都没有执行),把deco1内部的deco1Fun函数返回。
6、此时主函数中func(), 就已经相当于 deco1Fun() 了(因为func被装饰器修改,修改过程在2上方:先是func = deco1(func), 再执行func(), func = deco1(func) 就是把deco1的返回值(deco1Fun)赋值给func, 所以func相当于deco1Fun)
7、执行func(), 相当于执行deco1Fun(), 就是deco1内部的deoc1Fun执行,即3号语句,然后3号语句下方是deco1Fun函数内部的func函数,在第5条已说明,deco1Fun()内部的func函数即为deco1的参数(deco2内部的deco2Fun函数),那么执行这个func()函数就相当于执行了deco2内部的deco2Fun()
8、那么此时语句就进入了deco2Fun执行4号语句,往下deco2的decoFun内部的func()函数即为deco2的参数,即为主函数中的func函数(刚刚作为参数传入deco2,见第3条),那么就执行5号语句,此时deoc2内部deco2Fun内部的func()执行完成,继续向下。
9、执行6号语句,deco2Fun函数执行完成,也就意味着deco1内部的deco1Fun下的func()执行完成,刚才递归调用,一直还在执行这个函数,现在deco1Fun下的func()才完成。
10、往下7号语句,至此,主函数中的func() 正式完成。(相当于deco1Fun(func))
以上步骤为个人理解,如有错误,还望指正。
参考: