博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
python多个装饰器的执行顺序
阅读量:5022 次
发布时间:2019-06-12

本文共 1216 字,大约阅读时间需要 4 分钟。

def decorator_a(func):

print 'Get in decorator_a'
def inner_a(*args, **kwargs):
print 'Get in inner_a'
return func(*args, **kwargs)
return inner_a

def decorator_b(func):

print 'Get in decorator_b'
def inner_b(*args, **kwargs):
print 'Get in inner_b'
return func(*args, **kwargs)
return inner_b

@decorator_b

@decorator_a
def f(x):
print 'Get in f'
return x * 2

f(1)

执行如上所示代码,最后的执行结果为:

Get in decorator_a

Get in decorator_b
Get in inner_b
Get in inner_a
Get in f

我们来分析下,为什么会是这样的顺序(验证的过程中可以通过打断点的方式来观察函数的程序的执行流程)。

首先:

1、装饰器函数在被装饰函数定义好后立即执行。

我们把代码最后一行注掉:

# f(1)

重新执行,会发现最后执行结果为:

Get in decorator_a

Get in decorator_b

说明装饰器函数在被装饰函数定义好后就立即执行。而且执行顺序是由下到上开始装饰。调用decorator_a时,f被装饰成inner_a,调用decorator_b时,f被装饰成inner_b。

通过在最后执行:print(f), 执行结果为<function inner_b at 0x00000000038F15F8>可验证。

所以如上所示代码中,最后执行f(1)时,f已经变成了inner_b,而inner_b中return的func,实则为inner_a, inner_a中return的func才是最终的f。

所以最后的调用顺序为

inner_b --->inner_a--->f

执行结果为:

Get in inner_b

Get in inner_a
Get in f

 

在实际应用的场景中,当我们采用上面的方式写了两个装饰方法比如先验证有没有登录 @login_required , 再验证权限够不够时 @permision_allowed 时,我们采用下面的顺序来装饰函数:

@login_required

@permision_allowed
def f()
# Do something
return
总结一下:

多个装饰器装饰函数时,有个规律是从小到上包裹(装饰)函数,从上到下执行。

 

转载于:https://www.cnblogs.com/hyhy904/p/10971646.html

你可能感兴趣的文章
Parallel Python 并行开发多核心并行程序
查看>>
解决80端口占用
查看>>
【最小生成树】Connect the Cities
查看>>
现代软件与游戏的创新性分析
查看>>
C# DataTable下载
查看>>
ES6之map
查看>>
下拉插件dropload js时间计算(几天前)
查看>>
外部类监听发送短信--------------------------setOnLongClickListener------------------------
查看>>
JQuery-遮罩层
查看>>
【luogu P3371 单源最短路径】 模板 dij + heap
查看>>
(五)数据类型转换
查看>>
练习1--选老大问题
查看>>
简单研究Android View绘制三 布局过程
查看>>
红黑树(中序二叉树)
查看>>
Android Studio 运行出现 Multiple dex files define Landroid/support/annotation/AnimRes 解决方法...
查看>>
有关并查集的emmmm
查看>>
P1022 计算器的改良
查看>>
文件上传解析漏洞
查看>>
多线程频繁写全局变量导致性能降低
查看>>
移动端适配
查看>>