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僵尸进程产生的原因
Jul 21 Python
python嵌套字典比较值与取值的实现示例
Nov 03 Python
PHP实现发送和接收JSON请求
Jun 07 Python
关于python写入文件自动换行的问题
Jun 23 Python
Python读取txt文件数据的方法(用于接口自动化参数化数据)
Jun 27 Python
Python读取txt某几列绘图的方法
Oct 14 Python
python自定义线程池控制线程数量的示例
Feb 22 Python
django框架防止XSS注入的方法分析
Jun 21 Python
pytorch中的transforms模块实例详解
Dec 31 Python
tensorflow之获取tensor的shape作为max_pool的ksize实例
Jan 04 Python
Python爬虫爬取杭州24时温度并展示操作示例
Mar 27 Python
详解基于Facecognition+Opencv快速搭建人脸识别及跟踪应用
Jan 21 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
几种显示数据的方法的比较
2006/10/09 PHP
检查php文件中是否含有bom的函数
2012/05/31 PHP
destoon实现会员商铺中指定会员或会员组投放广告的方法
2014/08/21 PHP
Zend Framework教程之配置文件application.ini解析
2016/03/10 PHP
浅谈php使用curl模拟多线程发送请求
2019/03/08 PHP
PHP pthreads v3使用中的一些坑和注意点分析
2020/02/21 PHP
游戏人文件夹程序 ver 4.03
2006/07/14 Javascript
jQuery 判断页面元素是否存在的代码
2009/08/14 Javascript
jquery 与NVelocity 产生冲突的解决方法
2011/06/13 Javascript
jQuery截取指定长度字符串的实现原理及代码
2014/07/01 Javascript
js使用for循环及if语句判断多个一样的name
2014/09/09 Javascript
jQuery制作简单柱状图实例
2015/01/28 Javascript
js实现文字闪烁特效的方法
2015/12/17 Javascript
前端学习笔记style,currentStyle,getComputedStyle的用法与区别
2016/05/28 Javascript
利用ES6语法重构React组件详解
2017/03/02 Javascript
NodeJS学习笔记之Module的简介
2017/03/24 NodeJs
js和jQuery以及easyui实现对下拉框的指定赋值方法
2018/01/23 jQuery
layer.close()关闭进度条和Iframe窗的方法
2018/08/17 Javascript
VUE实现密码验证与提示功能
2019/10/18 Javascript
python实现跨文件全局变量的方法
2014/07/07 Python
Python自动化开发学习之三级菜单制作
2017/07/14 Python
rabbitmq(中间消息代理)在python中的使用详解
2017/12/14 Python
在Mac下使用python实现简单的目录树展示方法
2018/11/01 Python
Python自动化之数据驱动让你的脚本简洁10倍【推荐】
2019/06/04 Python
django表单的Widgets使用详解
2019/07/22 Python
python3图片文件批量重命名处理
2019/10/31 Python
Python3.6 + TensorFlow 安装配置图文教程(Windows 64 bit)
2020/02/24 Python
Python切割图片成九宫格的示例代码
2020/03/10 Python
解决pytorch多GPU训练保存的模型,在单GPU环境下加载出错问题
2020/06/23 Python
PyCharm Community安装与配置的详细教程
2020/11/24 Python
css3过渡_动力节点Java学院整理
2017/07/11 HTML / CSS
让IE下支持Html5的placeholder属性的插件
2014/09/02 HTML / CSS
策划助理岗位职责
2013/11/18 职场文书
国际残疾人日广播稿范文
2014/10/09 职场文书
共青团员自我评价
2015/03/10 职场文书
Python初识逻辑与if语句及用法大全
2021/08/07 Python