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
  • asp之家 网络编程 m.aspxhome.com