def outer1(func):
def inner1():
print('wrapper1-1')
func()
print('wrapper1-2')
return inner1
def outer2(func):
def inner2():
print('wrapper2-1')
func()
print('wrapper2-2')
return inner2
@outer1 # outer1(outer2(show))
@outer2 # show = outer2(show)
def show():
print('show')
show()
修饰的时候是从内向外执行,先执行@outer1
这时,func = show
show = inner2
然后再执行@outer2,相当于做了一个show = outer1(outer2(show))
这时 outer2(show)是参数 也是inner2,show =inner1
show()执行的时候,执行的是inner1里的语句 也就是
print(‘wrapper1-1’)
func()
print(‘wrapper1-2’)
这里的func就是outer2(show) ,也就是inner2
所以完整的过程应该是
print(‘wrapper1-1’)
print(‘wrapper2-1’)
func()
print(‘wrapper2-2’)
print(‘wrapper1-2’)
这里的func是inner2里的func,也就是真正的show函数,即print(‘show’)