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写的Socks5协议代理服务器
Aug 06 Python
用Python写王者荣耀刷金币脚本
Dec 21 Python
Python程序运行原理图文解析
Feb 10 Python
Python Learning 列表的更多操作及示例代码
Aug 22 Python
Django migrations 默认目录修改的方法教程
Sep 28 Python
python itchat实现调用微信接口的第三方模块方法
Jun 11 Python
PyQt5基本控件使用之消息弹出、用户输入、文件对话框的使用方法
Aug 06 Python
pytorch 在网络中添加可训练参数,修改预训练权重文件的方法
Aug 17 Python
python pandas.DataFrame.loc函数使用详解
Mar 26 Python
Django实现任意文件上传(最简单的方法)
Jun 03 Python
python requests库的使用
Jan 06 Python
一个入门级python爬虫教程详解
Jan 27 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 实用代码收集
2010/01/22 PHP
php文件上传后端处理小技巧
2016/05/22 PHP
PHP面向对象程序设计继承用法简单示例
2018/12/28 PHP
jQuery使用手册之 事件处理
2007/03/24 Javascript
JS和JQUERY获取页面大小,滚动条位置,元素位置(示例代码)
2013/12/14 Javascript
在父页面得到zTree已选中的节点的方法
2015/02/12 Javascript
JavaScript将当前时间转换成UTC标准时间的方法
2015/04/06 Javascript
javascript模拟评分控件实现方法
2015/05/13 Javascript
深入解读JavaScript中的Iterator和for-of循环
2015/07/28 Javascript
使用ionic在首页新闻中应用到的跑马灯效果的实现方法
2017/02/13 Javascript
js实现QQ面板拖拽效果(慕课网DOM事件探秘)(全)
2017/09/19 Javascript
vueJs实现DOM加载完之后自动下拉到底部的实例代码
2018/08/31 Javascript
Vue+Element实现动态生成新表单并添加验证功能
2019/05/23 Javascript
vue实现简单的日历效果
2020/09/24 Javascript
django js 实现表格动态标序号的实例代码
2019/07/12 Javascript
Python对list列表结构中的值进行去重的方法总结
2016/05/07 Python
Python使用pyautogui模块实现自动化鼠标和键盘操作示例
2018/09/04 Python
python中的colorlog库使用详解
2019/07/05 Python
python之拟合的实现
2019/07/19 Python
python 模拟创建seafile 目录操作示例
2019/09/26 Python
Pycharm中安装Pygal并使用Pygal模拟掷骰子(推荐)
2020/04/08 Python
jupyter notebook快速入门及使用详解
2020/11/13 Python
Veronica Beard官网:在酷、经典和别致之间找到了平衡
2018/01/11 全球购物
Blue Nile中国官网:全球知名的钻石和珠宝网络零售商
2020/03/22 全球购物
马来西亚奢侈品牌购物商城:Valiram 247
2020/09/29 全球购物
C#如何进行LDAP用户校验
2012/11/21 面试题
酒店实习个人鉴定
2013/12/07 职场文书
就业意向书
2014/07/29 职场文书
委托书如何写
2014/08/30 职场文书
2014年预备党员端正入党动机思想汇报
2014/09/13 职场文书
镇党政领导班子民主生活会思想汇报
2014/10/11 职场文书
党员三严三实对照检查材料
2014/10/13 职场文书
给病人的慰问信
2015/03/23 职场文书
施工现场安全管理制度
2015/08/05 职场文书
基于python制作简易版学生信息管理系统
2021/04/20 Python
解决ObjectMapper.convertValue() 遇到的一些问题
2021/06/30 Java/Android