一、前置说明
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 的作用