先上代碼和效果
def wrapper_a(func): #1 #3
print(' in wrapper_a') #4
def inner_a(*args, **kwargs): #5 #15
print('start inner_a') #16
func(*args, **kwargs) #17
print('stop inner_a') #20
return inner_a #6
def wrapper_b(func): #2 #7
print('in wrapper_b') #8
def inner_b(*args, **kwargs): #9 #12
print('start inner_b') #13
func(*args, **kwargs) #14
print('stop Inner_b') #21
return inner_b #10
@wrapper_b
@wrapper_a
def f(x):
print 'in f' #18
return x #19
f(3) #11
輸出:
in wrapper_a
in wrapper_b
start inner_b
start inner_a
in f
stop Inner_a
stop Inner_b
@wrapper_b #
@wrapper_a
def f(x): #
print 'in f'
return x
# 相當(dāng)于
f = wrapper_b(wrapper_a(f))
執(zhí)行步驟詳解:
定義階段
- 定義wrapper_a
- 定義wrapper_b
- 進(jìn)入wrapper_a麻诀, 參數(shù)func指代 f(x)
- 輸出 "in wrapper_a"
- 定義inner_a ===> inner_a(*args, **kwargs)[parent=f1]
- 返回innder_a對(duì)象====>inner_a(*args, **kwargs)[parent=f1]
- 進(jìn)入wrapper_b, 此時(shí)wrapper_b的參數(shù)func為inner_a(*args, **kwargs)
- 輸出'in wrapper_b'
- 定義inner_b =====>inner_b(*args, **kwargs)[parent=f2]
- 返回inner_b對(duì)象 ====>inner_b(*args, **kwargs)[parent=f2]
執(zhí)行階段
- 執(zhí)行f(3),此時(shí)的f函數(shù)指的是inner_b(*args, **kwargs) [parent=f2]
- 執(zhí)行inner_b函數(shù),此時(shí)args=(3,), kwargs={}
- 輸出'start inner_b'
- 調(diào)用innder_b中的func,就是inner_a(*args, **kwargs)
- 執(zhí)行inner_a(*args, **kwargs) 此時(shí)的args=(3,), kwargs={}
- 輸出'start inner_a'
- 執(zhí)行inner_a中的func痊乾,就是被裝飾的函數(shù)f
- 輸出"in f"
- 退出函數(shù)f
- 輸出"stop inner_a"
- 輸出 "stop Inner_b'"