先上代码和效果
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
# 相当于
f = wrapper_b(wrapper_a(f))
执行步骤详解:
定义阶段
- 定义wrapper_a
- 定义wrapper_b
- 进入wrapper_a, 参数func指代 f(x)
- 输出 "in wrapper_a"
- 定义inner_a ===> inner_a(*args, **kwargs)[parent=f1]
- 返回innder_a对象====>inner_a(*args, **kwargs)[parent=f1]
- 进入wrapper_b, 此时wrapper_b的参数func为inner_a(*args, **kwargs)
- 输出'in wrapper_b'
- 定义inner_b =====>inner_b(*args, **kwargs)[parent=f2]
- 返回inner_b对象 ====>inner_b(*args, **kwargs)[parent=f2]
执行阶段
- 执行f(3),此时的f函数指的是inner_b(*args, **kwargs) [parent=f2]
- 执行inner_b函数,此时args=(3,), kwargs={}
- 输出'start inner_b'
- 调用innder_b中的func,就是inner_a(*args, **kwargs)
- 执行inner_a(*args, **kwargs) 此时的args=(3,), kwargs={}
- 输出'start inner_a'
- 执行inner_a中的func,就是被装饰的函数f
- 输出"in f"
- 退出函数f
- 输出"stop inner_a"
- 输出 "stop Inner_b'"
网友评论