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实现在pickling的时候压缩的方法
Sep 25 Python
Python操作MySQL简单实现方法
Jan 26 Python
通过mod_python配置运行在Apache上的Django框架
Jul 22 Python
使用py2exe在Windows下将Python程序转为exe文件
Mar 04 Python
Python编程修改MP3文件名称的方法
Apr 19 Python
tensorflow学习笔记之简单的神经网络训练和测试
Apr 15 Python
python2和python3的输入和输出区别介绍
Nov 20 Python
Python 一键制作微信好友图片墙的方法
May 16 Python
用sqlalchemy构建Django连接池的实例
Aug 29 Python
Python PyQt5运行程序把输出信息展示到GUI图形界面上
Apr 27 Python
Python datetime模块使用方法小结
Jun 18 Python
Python几种酷炫的进度条的方式
Apr 11 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生成缩略图的代码
2011/01/12 PHP
Symfony页面的基本创建实例详解
2015/01/26 PHP
php删除文本文件中重复行的方法
2015/04/28 PHP
php使用Jpgraph绘制简单X-Y坐标图的方法
2015/06/10 PHP
PHP写API输出的时用echo的原因详解
2019/04/28 PHP
Javascript学习笔记6 prototype的提出
2010/01/11 Javascript
JavaScript中__proto__与prototype的关系深入理解
2012/12/04 Javascript
jQuery通过扩展实现抖动效果的方法
2015/03/11 Javascript
简介JavaScript中toTimeString()方法的使用
2015/06/12 Javascript
轻松使用jQuery双向select控件Bootstrap Dual Listbox
2015/12/13 Javascript
详解javascript实现瀑布流绝对式布局
2016/01/29 Javascript
浅谈JavaScript 数据属性和访问器属性
2016/09/01 Javascript
使用jQuery实现一个类似GridView的编辑,更新,取消和删除的功能
2017/03/15 Javascript
Vue2.0如何发布项目实战
2017/07/27 Javascript
JavaScript实现的级联算法示例【省市二级联动功能】
2018/12/25 Javascript
详解vue beforeRouteEnter 异步获取数据给实例问题
2019/08/09 Javascript
Python3基础之输入和输出实例分析
2014/08/18 Python
Python实现的redis分布式锁功能示例
2018/05/29 Python
Python使用分布式锁的代码演示示例
2018/07/30 Python
pandas 使用均值填充缺失值列的小技巧分享
2019/07/04 Python
如何基于Python批量下载音乐
2019/11/11 Python
CSS3实现文字波浪线效果示例代码
2016/11/20 HTML / CSS
德国EGOIST网店:销售畅销的设计师品牌
2017/04/18 全球购物
高性能装备提升营地:Kammok
2019/02/27 全球购物
经济实惠的名牌太阳镜和眼镜:Privé Revaux
2021/02/07 全球购物
旅游管理实习自我鉴定
2013/09/29 职场文书
函授毕业自我鉴定
2014/02/04 职场文书
学术会议主持词
2014/03/17 职场文书
质量月口号
2014/06/20 职场文书
大学生感恩父母演讲稿
2014/08/28 职场文书
党员干部三严三实心得体会
2014/10/13 职场文书
违纪检讨书范文
2015/01/27 职场文书
单方投资意向书
2015/05/11 职场文书
MySQL 8.0 之不可见列的基本操作
2021/05/20 MySQL
Python+Tkinter打造签名设计工具
2022/04/01 Python