一、前置说明
1、本节目标
- 了解装饰器的执行过程。
2、相关回顾
二、主要内容
1、Demo 示例
def decorator1(func): def wrapper1(): print("Decorator 1") func() return wrapper1 def decorator2(func): def wrapper2(): print("Decorator 2") func() return wrapper2 @decorator1 @decorator2 def my_function(): print("Original function") my_function()
输出结果:
Decorator 1 Decorator 2 Original function
2、过程分析
- 首先,
@decorator2
在my_function
上应用了decorator2
装饰器,相当于执行my_function = decorator2(my_function)
。decorator2(my_function)
的执行结果为wrapper2
,所以,此时my_function
就是wrapper2
的引用。 - 然后,
@decorator1
在已经被decorator2
装饰过的my_function
上再次应用了decorator1
装饰器。这相当于执行了my_function = decorator1(decorator2(my_function))
,即my_function = decorator1(wrapper2)
。decorator1(wrapper2)
的执行结果为wrapper1
,所以,此时my_function
为wrapper1
的引用。 - 当调用
my_function()
时,等同于执行wrapper1()
,"Decorator 1"被打印出来,然后执行func()
; - 此时
func
为wrapper2
,func()
相当于执行wrapper2()
, “Decorator 2” 被打印出来,然后执行func()
; - 此时
func
为my_function
,func()
相当于执行my_function()
,"Original function"被打印出来。 - 执行结束。
三、后置说明
1、要点小结
- 当调用
my_function()
时,实际上是调用了经过两个装饰器包装后的新函数。 - 执行顺序是先执行最外层的
decorator1
,再执行内层的decorator2
,最后执行原始函数。
2、下节准备
- @functools.wraps 的作用