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
投稿
猜你喜欢
python套接字流重定向实例汇总
2022-04-15 07:53:41
用一条SQL实现:一行多个字段数据的最大值
2008-12-31 13:37:00
JS数组方法汇总
2009-08-03 14:06:00
Cookies 欺骗漏洞的防范方法(vbs+js 实现)
2011-03-09 11:09:00
提高asp程序访问速度的方法
2008-10-23 16:37:00
python+tkinter编写电脑桌面放大镜程序实例代码
2023-08-02 17:10:43
python实现电脑自动关机
2021-05-03 13:41:43
ASP+FSO生成的网页文件默认编码格式以及转换成UTF-8编码方法
2011-03-07 11:10:00
tkinter如何实现label超链接调用浏览器打开网址
2023-04-05 15:08:20
设计表单的标签和输入区
2009-04-27 16:16:00
Python实现绘制圣诞树和烟花的示例代码
2022-03-22 16:22:20
MySQL数据库配置技巧
2009-03-06 14:32:00
Pyinstaller+Pipenv打包Python文件的实现示例
2021-06-11 01:49:51
Python列表list内建函数用法实例分析【insert、remove、index、pop等】
2022-01-13 10:18:24
Python词法结构
2022-01-10 00:33:21
Js通过AES加密后PHP用Openssl解密的方法
2023-07-17 08:04:42
内容呈现的减法
2007-11-16 16:22:00
JavaScript学习心得之如何走出初学困境
2008-12-24 13:30:00
关于ASP代码的加密
2007-10-15 12:30:00
python的语句结构你真的了解吗
2022-08-11 23:05:39