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


Posted in Python onOctober 08, 2018

装饰器是程序开发中经常会用到的一个功能,也是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--

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

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

Python 相关文章推荐
linux环境下python中MySQLdb模块的安装方法
Jun 16 Python
Python基于tkinter模块实现的改名小工具示例
Jul 27 Python
Python使用matplotlib实现的图像读取、切割裁剪功能示例
Apr 28 Python
Python实现的多进程拷贝文件并显示百分比功能示例
Apr 09 Python
解决python3中的requests解析中文页面出现乱码问题
Apr 19 Python
Django框架登录加上验证码校验实现验证功能示例
May 23 Python
python3发送邮件需要经过代理服务器的示例代码
Jul 25 Python
Python 切分数组实例解析
Nov 07 Python
VSCode配合pipenv搞定虚拟环境的实现方法
May 17 Python
Python基于staticmethod装饰器标示静态方法
Oct 17 Python
PyCharm2020.3.2安装超详细教程
Feb 08 Python
python 批量压缩图片的脚本
Jun 02 Python
使用EduBlock轻松学习Python编程
Oct 08 #Python
Django forms组件的使用教程
Oct 08 #Python
详解关于Django中ORM数据库迁移的配置
Oct 08 #Python
面向初学者的Python编辑器Mu
Oct 08 #Python
Django 实现购物车功能的示例代码
Oct 08 #Python
一行代码让 Python 的运行速度提高100倍
Oct 08 #Python
Python django使用多进程连接mysql错误的解决方法
Oct 08 #Python
You might like
header中Content-Disposition的作用与使用方法
2012/06/13 PHP
php 数组随机取值的简单实例
2016/05/23 PHP
php use和include区别总结
2019/10/13 PHP
Laravel 框架基于自带的用户系统实现登录注册及错误处理功能分析
2020/04/14 PHP
JS 参数传递的实际应用代码分析
2009/09/13 Javascript
测试JavaScript字符串处理性能的代码
2009/12/07 Javascript
再谈querySelector和querySelectorAll的区别与联系
2012/04/20 Javascript
js用闭包遍历树状数组的方法
2014/03/19 Javascript
JavaScript框架(iframe)操作总结
2014/04/16 Javascript
使用ajaxfileupload.js实现ajax上传文件php版
2014/06/26 Javascript
JavaScript比较两个对象是否相等的方法
2015/02/06 Javascript
学习JavaScript编程语言的8张思维导图分享
2015/03/27 Javascript
js实现文字在按钮上滚动的方法
2015/08/20 Javascript
javascript HTML+CSS实现经典橙色导航菜单
2016/02/16 Javascript
AngularJS基础 ng-list 指令详解及示例代码
2016/08/02 Javascript
AngularJS表单提交实例详解
2017/02/18 Javascript
深入浅析JavaScript中的RegExp对象
2017/09/18 Javascript
javascript浏览器用户代理检测脚本实现方法
2017/10/27 Javascript
判断“命令按钮”是否被鼠标单击详解
2019/07/31 Javascript
在layui.use 中自定义 function 的正确方法
2019/09/16 Javascript
如何在Vue中使localStorage具有响应式(思想实验)
2020/07/14 Javascript
创建与框架无关的JavaScript插件
2020/12/01 Javascript
[50:02]完美世界DOTA2联赛循环赛 Magma vs IO BO2第一场 11.01
2020/11/02 DOTA
python使用arp欺骗伪造网关的方法
2015/04/24 Python
详解Python编程中包的概念与管理
2015/10/16 Python
python 全局变量的import机制介绍
2017/09/07 Python
python里使用正则的findall函数的实例详解
2017/10/19 Python
Python Unittest自动化单元测试框架详解
2018/04/04 Python
解决Django生产环境无法加载静态文件问题的解决
2019/04/23 Python
python爬虫实例之获取动漫截图
2020/05/31 Python
世界领先的高品质定制产品平台:Zazzle
2017/07/23 全球购物
英国休闲奢华的缩影:Crew Clothing
2019/05/05 全球购物
酒店大堂副理的职责范文
2014/02/13 职场文书
心理学专业求职信
2014/06/16 职场文书
党员群众路线整改措施及今后努力方向
2014/10/28 职场文书
高一作文之乐趣
2019/11/21 职场文书