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 相关文章推荐
python抓取网页时字符集转换问题处理方案分享
Jun 19 Python
python绘制条形图方法代码详解
Dec 19 Python
win10系统下Anaconda3安装配置方法图文教程
Sep 19 Python
python组合无重复三位数的实例
Nov 13 Python
使用pandas把某一列的字符值转换为数字的实例
Jan 29 Python
python实现文件的备份流程详解
Jun 18 Python
python SQLAlchemy 中的Engine详解
Jul 04 Python
python创建与遍历List二维列表的方法
Aug 16 Python
Python 中list ,set,dict的大规模查找效率对比详解
Oct 11 Python
Python笔记之代理模式
Nov 20 Python
python统计函数库scipy.stats的用法解析
Feb 25 Python
详解python环境安装selenium和手动下载安装selenium的方法
Mar 17 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
十天学会php之第四天
2006/10/09 PHP
php中$_REQUEST、$_POST、$_GET的区别和联系小结
2011/11/23 PHP
PHP中的静态变量及static静态变量使用详解
2015/11/05 PHP
CodeIgniter辅助之第三方类库third_party用法分析
2016/01/20 PHP
PHP架构及原理知识点详解
2019/12/22 PHP
Laravel框架集合用法实例浅析
2020/05/14 PHP
js控制表单操作的常用代码小结
2013/08/15 Javascript
javascript中动态加载js文件多种解决办法总结
2013/11/15 Javascript
JQUERY 设置SELECT选中项代码
2014/02/07 Javascript
JS回调函数的应用简单实例
2014/09/17 Javascript
基于NodeJS的前后端分离的思考与实践(四)安全问题解决方案
2014/09/26 NodeJs
JS拖动鼠标画出方框实现鼠标选区的方法
2015/08/05 Javascript
JavaScript+html5 canvas绘制缤纷多彩的三角形效果完整实例
2016/01/26 Javascript
AngularJS验证信息框架的封装插件用法【w5cValidator扩展插件】
2016/11/03 Javascript
jQuery实现可拖拽3D万花筒旋转特效
2017/01/03 Javascript
原生js实现无限循环轮播图效果
2017/01/20 Javascript
jQuery中clone()函数实现表单中增加和减少输入项
2017/05/13 jQuery
微信小程序实现类似微信点击语音播放效果
2020/03/30 Javascript
vue.js的简单自动求和计算实例
2019/11/08 Javascript
js面向对象之实现淘宝放大镜
2020/01/15 Javascript
jQuery插件实现图片轮播效果
2020/10/19 jQuery
JavaScript实现图片合成下载的示例
2020/11/19 Javascript
Python数据类型详解(二)列表
2016/05/08 Python
分享一个可以生成各种进制格式IP的小工具实例代码
2017/07/28 Python
Python第三方库h5py_读取mat文件并显示值的方法
2019/02/08 Python
django框架使用方法详解
2019/07/18 Python
wxPython实现画图板
2020/08/27 Python
详解python tkinter包获取本地绝对路径(以获取图片并展示)
2020/09/04 Python
把富文本的回车转为br标签
2019/08/09 HTML / CSS
香港交友网站:be2香港
2018/07/22 全球购物
软件测试工程师结构化面试题库
2016/11/23 面试题
海上钢琴师的观后感
2015/06/11 职场文书
大学生受助感言
2015/08/01 职场文书
企业转让协议书(范文2篇)
2019/08/15 职场文书
Django路由层如何获取正确的url
2021/07/15 Python
《吸血鬼幸存者》新内容发布 追加多个全新模式
2022/04/07 其他游戏