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的GUI框架PySide的安装配置教程
Feb 16 Python
Python Sql数据库增删改查操作简单封装
Apr 18 Python
Python使用matplotlib绘图无法显示中文问题的解决方法
Mar 14 Python
Python使用numpy产生正态分布随机数的向量或矩阵操作示例
Aug 22 Python
使用python采集脚本之家电子书资源并自动下载到本地的实例脚本
Oct 23 Python
Python基于opencv调用摄像头获取个人图片的实现方法
Feb 21 Python
对python 中class与变量的使用方法详解
Jun 26 Python
pycharm配置git(图文教程)
Aug 16 Python
Python scrapy增量爬取实例及实现过程解析
Dec 24 Python
python opencv常用图形绘制方法(线段、矩形、圆形、椭圆、文本)
Apr 12 Python
解决Python字典查找报Keyerror的问题
May 26 Python
使用python+pygame开发消消乐游戏附完整源码
Jun 10 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
BBS(php & mysql)完整版(三)
2006/10/09 PHP
php模板原理讲解
2013/11/13 PHP
WordPress中Gravatar头像缓存到本地及相关优化的技巧
2015/12/19 PHP
对YUI扩展的Gird组件 Part-2
2007/03/10 Javascript
YUI 读码日记之 YAHOO.lang.is*
2008/03/22 Javascript
jQuery获得页面元素的绝对/相对位置即绝对X,Y坐标
2014/03/06 Javascript
封装了一个支持匿名函数的Javascript事件监听器
2014/06/05 Javascript
BootStrap网页中代码显示用法详解
2016/10/21 Javascript
Javascript中return的使用与闭包详解
2017/01/11 Javascript
vue2中filter()的实现代码
2017/07/09 Javascript
Vue实现点击后文字变色切换方法
2018/02/11 Javascript
垃圾回收器的相关知识点总结
2018/05/13 Javascript
Angular4 组件通讯方法大全(推荐)
2018/07/12 Javascript
详解ECMAScript typeof用法
2018/07/25 Javascript
Vue中消息横向滚动时setInterval清不掉的问题及解决方法
2019/08/23 Javascript
深入理解javascript中的this
2021/02/08 Javascript
python中import学习备忘笔记
2017/01/24 Python
Python Requests模拟登录实现图书馆座位自动预约
2018/04/27 Python
在Python 中实现图片加框和加字的方法
2019/01/26 Python
对Python函数设计规范详解
2019/07/19 Python
python函数参数(必须参数、可变参数、关键字参数)
2019/08/16 Python
MoviePy常用剪辑类及Python视频剪辑自动化
2020/12/18 Python
全球知名旅游社区巴西站点:TripAdvisor巴西
2016/07/21 全球购物
塔吉特百货公司官网:Target
2017/04/27 全球购物
小学教师的个人自我鉴定
2013/10/24 职场文书
大学社团活动策划书
2014/01/26 职场文书
《九寨沟》教学反思
2014/04/08 职场文书
市场部经理岗位职责
2014/04/10 职场文书
《陈毅探母》教学反思
2014/05/01 职场文书
关于祖国的演讲稿
2014/05/04 职场文书
2014年信息技术工作总结
2014/12/16 职场文书
2015年英语教学工作总结
2015/05/25 职场文书
暂住证证明
2015/06/19 职场文书
中学团支部工作总结
2015/08/13 职场文书
2016年习主席讲话学习心得体会
2016/01/20 职场文书
Python Django获取URL中的数据详解
2021/11/01 Python