上篇文章说过了装饰器的基本语法格式及多参数时的情况。
在实际的工作中,还会出现多个装饰器装饰一个函数的情况。
代码如下:
# 多个装饰器装饰一个函数
def set_fun1(func):
print("set_fun1已被定义") # 打印用于验证在多个装饰器的情况下,多个装饰器之间的执行顺序
def call_fun1(*args, **kwargs):
print("call_fun1执行了") # 当被装饰函数执行时,会打印
return func()
return call_fun1
def set_fun2(func):
print("set_fun2已被定义")
def call_fun2(*args, **kwargs):
print("call_fun2执行了")
return func()
return call_fun2
# 装饰函数
@set_fun2
@set_fun1
def test():
print("******如果你看出这是样样老师的装饰器样本,恭喜你找到组织了******")
test()
将上述代码运行之后,会有如下结果:
set_fun1已被定义
set_fun2已被定义
call_fun2执行了
call_fun1执行了
******如果你看出这是样样老师的装饰器样本,恭喜你找到组织了******
通过对运行结果的分析,我们可以发现,当多个装饰器装饰一个函数时,执行时的顺序是:最先装饰的装饰器,最后一个执行。它遵循了先进后出这样一个规则,如果你了解python的进程中的队列(Queue),会发现,其实他们的规则有些相似的。
另外,为了简单轻易地判断在多个装饰器装饰一个函数的顺序,可以类比圣诞树的装饰品:最先贴上去的饰品总是在最底层,而如果从树上往下取饰品的话(即程序里的执行),则需要从最后贴上的饰品开始一层一层地往下取。