Python多个装饰器的调用顺序实例解析
作者:一切都是当下 时间:2021-09-30 06:54:56
一般情况下,在函数中可以使用一个装饰器,但是有时也会有两个或两个以上的装饰器。多个装饰器装饰的顺序是从里到外(就近原则),而调用的顺序是从外到里(就远原则)
样例:
def func1(func):
print(1)
def inner1(*args, **kwargs):
print(2)
res = func(*args, **kwargs)
print(3)
return res
print(4)
return inner
def func2(func):
print(5)
def inner2(*args, **kwargs):
print(6)
res = func(*args, **kwargs)
print(7)
return res
print(8)
return inner<br data-filtered="filtered">
@func1
@func2
def go():
print("running..")<br data-filtered="filtered">go()
其实函数go的执行本质是如下:
a=func2(go);a的内容为inner2函数的函数地址;因此输出的内容为5,8两个值
b=func1(a);b的内容为inner1函数的函数地址,因此输出的内容为1,4两个值
b();执行inner1()函数,里面的func的值为inner2,而inner2里面的func的值为go,因此输出的内容,因此为2,6,running,7,3
即b(func1(func2(go)))()
等同如下效果:
a=func2(go);a的内容为inner2函数的函数地址;因此输出的内容为5,8两个值
go=func1(a);此处的go是一个新变量,而非go函数的标识,go的内容为inner1函数的函数地址,因此输出的内容为1,4两个值
go();执行inner1()函数,里面的func的值为inner2,而inner2里面的func的值为真正定义的go函数地址,因此输出的内容,因此为2,6,running,7,3
即go(func1(func2(go)))()
实测结果:
C:\Python27\python.exe D:/code-program/lianxi-test/route.py
5
8
1
4
2
6
running..
7
3
Process finished with exit code 0
来源:https://www.cnblogs.com/potato-chip/p/12918135.html
标签:Python,装饰器,顺序
0
投稿
猜你喜欢
MySQL 数据查重、去重的实现语句
2024-01-25 10:46:34
jquery判断单选按钮radio是否选中的方法
2024-04-19 10:18:25
打包发布Python模块的方法详解
2021-04-03 06:10:56
python扫描proxy并获取可用代理ip的实例
2023-07-29 16:42:50
Python pandas中apply函数简介以及用法详解
2022-05-11 03:44:47
python神经网络Keras实现LSTM及其参数量详解
2023-02-09 14:02:22
Jar包一键重启的Shell脚本及新服务器部署的一些经验分享
2023-06-24 19:01:08
Scrapy+Selenium自动获取cookie爬取网易云音乐个人喜爱歌单
2023-06-26 10:15:54
Python 不设计 do-while 循环结构的理由
2021-08-04 11:55:19
全面详解JS正则中匹配技巧及示例
2024-03-24 15:07:39
MySql InnoDB存储引擎之Buffer Pool运行原理讲解
2024-01-27 01:46:50
使用Dreamweaver代码片断提高css开发效率
2007-10-28 15:46:00
Python类中self参数用法详解
2023-06-19 00:40:54
python uuid生成唯一id或str的最简单案例
2021-06-07 00:40:45
SQL Server本地时间和UTC时间的相互转换实现代码
2024-01-21 06:35:33
MySql数据库时间序列间隔查询方式
2024-01-27 15:23:03
实战手记:让百万级数据瞬间导入SQL Server
2010-06-07 14:13:00
Python包和模块的分发详细介绍
2021-10-06 07:25:32
框架布局慎用元素
2008-12-21 16:33:00
Python使用 OpenCV 进行图像投影变换
2021-09-10 03:08:19