python中多个装饰器的执行顺序详解

作者:wyzane 时间:2022-04-30 13:43:51 

装饰器是程序开发中经常会用到的一个功能,也是python语言开发的基础知识,如果能够在程序中合理的使用装饰器,不仅可以提高开发效率,而且可以让写的代码看上去显的高大上^_^

使用场景

可以用到装饰器的地方有很多,简单的举例如以下场景

  • 引入日志

  • 函数执行时间统计

  • 执行函数前预备处理

  • 执行函数后清理功能

  • 权限校验等场景

  • 缓存

今天讲一下python中装饰器的执行顺序,以两个装饰器为例。

装饰器代码如下:


def wrapper_out1(func):
print('--out11--')

def inner1(*args, **kwargs):
 print("--in11--")
 ret = func(*args, **kwargs)
 print("--in12--")
 return ret
print("--out12--")
return inner1

def wrapper_out2(func):
print('--out21--')

def inner2(*args, **kwargs):
 print("--in21--")
 ret = func(*args, **kwargs)
 print("--in22--")
 return ret
print("--out22")
return inner2

@wrapper_out2
@wrapper_out1
def test():
print("--test--")
return 1 * 2

if __name__ == '__main__':
test()

执行结果如下:

"""
--out11--
--out12--
--out21--
--out22--
--in21--
--in11--
--test--
--in12--
--in22--
"""

执行顺序以图片形式展示如下:

python中多个装饰器的执行顺序详解

先进入离test函数最近的装饰器,由于装饰器中返回的是函数的函数名引用,并非真正调用函数,所以先打印:

--out11--
--out12--
--out21--
--out22--

到inner2后,func会真正执行函数,会调用inner1(),所以再打印:

--in21--
--in11--

到inner1中,func会调用test函数,所以会打印:

--test--

再从各个函数出来后,会依次打印:

--in12--
--in22--

合起来就是上面的执行结果。

来源:https://segmentfault.com/a/1190000016603109

标签:python,多装饰器,执行顺序
0
投稿

猜你喜欢

  • 用Python的Django框架来制作一个RSS阅读器

    2023-01-31 19:17:33
  • python实现简单飞机大战小游戏

    2023-12-19 06:55:37
  • python如何实现数据的线性拟合

    2023-10-08 01:56:01
  • Python input()函数案例教程

    2021-12-21 15:45:02
  • pip指定python位置安装软件包的方法

    2023-07-13 10:29:47
  • python+selenium实现简历自动刷新的示例代码

    2023-11-27 16:13:01
  • python实现计算资源图标crc值的方法

    2022-07-02 17:57:56
  • CSS控制Table表格文字样式

    2008-06-11 18:53:00
  • Python cookbook(数据结构与算法)从序列中移除重复项且保持元素间顺序不变的方法

    2023-03-01 14:24:38
  • Mootools 1.2教程(20)——选项卡效果(Tabs)

    2008-12-26 18:19:00
  • Python语法中的模糊语义

    2022-09-13 01:22:57
  • Pytest+Request+Allure+Jenkins实现接口自动化

    2021-04-09 13:50:44
  • 解决vant框架做H5时踩过的坑(下拉刷新、上拉加载等)

    2024-05-13 09:44:31
  • Python基于Webhook实现github自动化部署

    2023-09-28 21:31:27
  • Django基于ORM操作数据库的方法详解

    2024-01-28 18:53:52
  • JavaScript 事件参考手册

    2024-04-10 10:44:51
  • pycharm激活方法到2099年(激活流程)

    2022-11-17 05:45:35
  • 使用XML技术上传文件的例子

    2008-05-29 11:33:00
  • python管理包路径之pycharm自动解决包路径注册

    2023-07-14 14:25:38
  • 如何修复使用 Python ORM 工具 SQLAlchemy 时的常见陷阱

    2022-07-03 20:51:47
  • asp之家 网络编程 m.aspxhome.com