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解析nginx日志文件
May 11 Python
Python中Collections模块的Counter容器类使用教程
May 31 Python
python分割列表(list)的方法示例
May 07 Python
Python读取MRI并显示为灰度图像实例代码
Jan 03 Python
tensorflow 恢复指定层与不同层指定不同学习率的方法
Jul 26 Python
python常用库之NumPy和sklearn入门
Jul 11 Python
Python使用Pandas对csv文件进行数据处理的方法
Aug 01 Python
Python中的引用和拷贝实例解析
Nov 14 Python
python-web根据元素属性进行定位的方法
Dec 13 Python
Windows下python3安装tkinter的问题及解决方法
Jan 06 Python
Pycharm+Python工程,引用子模块的实现
Mar 09 Python
python字符串拼接.join()和拆分.split()详解
Nov 23 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读取flv文件的播放时间长度
2009/09/03 PHP
PHP CURL模拟GET及POST函数代码
2010/04/25 PHP
php unlink()函数使用教程
2018/07/12 PHP
MSN消息提示类
2006/09/05 Javascript
jQuery之按钮组件的深入解析
2013/06/19 Javascript
Jquery 获取指定标签的对象及属性的设置与移除
2014/05/29 Javascript
如何解决手机浏览器页面点击不跳转浏览器双击放大网页
2016/07/01 Javascript
Javascript 函数的四种调用模式
2016/11/05 Javascript
AngularJS表格添加序号的方法
2017/03/03 Javascript
Node.js如何响应Ajax的POST请求并且保存为JSON文件详解
2017/03/10 Javascript
JavaScript基础之this和箭头函数详析
2019/09/05 Javascript
Vue根据条件添加click事件的方式
2019/11/09 Javascript
微信小程序实现上拉加载功能
2019/11/20 Javascript
js实现上传图片并显示图片名称
2019/12/18 Javascript
jquery实现直播视频弹幕效果
2020/02/25 jQuery
vue 项目软键盘回车触发搜索事件
2020/09/09 Javascript
[00:32]2018DOTA2亚洲邀请赛Newbee出场
2018/04/03 DOTA
[01:02:04]EG vs Liquid 2019国际邀请赛淘汰赛 败者组 BO3 第一场 8.23
2019/09/05 DOTA
Python制作钉钉加密/解密工具
2016/12/07 Python
python多进程提取处理大量文本的关键词方法
2018/06/05 Python
使用python的pandas库读取csv文件保存至mysql数据库
2018/08/20 Python
python 比较2张图片的相似度的方法示例
2019/12/18 Python
Python爬取新型冠状病毒“谣言”新闻进行数据分析
2020/02/16 Python
PyCharm License Activation激活码失效问题的解决方法(图文详解)
2020/03/12 Python
python线性插值解析
2020/07/05 Python
Autopep8的使用(python自动编排工具)
2021/03/02 Python
html5音频_动力节点Java学院整理
2018/08/22 HTML / CSS
广州品高软件.net笔面试题目
2012/04/18 面试题
应用化学专业本科生求职信
2013/09/29 职场文书
会计电算一体化个人简历的自我评价
2013/10/15 职场文书
留学推荐信中文范文三篇
2014/01/25 职场文书
8和9的加减法教学反思
2014/05/01 职场文书
老干部工作先进集体事迹材料
2014/05/21 职场文书
党的群众路线教育实践活动对照检查剖析材料
2014/10/09 职场文书
办公室卫生管理制度
2015/08/04 职场文书
JavaScript实现复选框全选功能
2021/04/11 Javascript