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的Django框架中的通用视图
May 04 Python
Python使用multiprocessing实现一个最简单的分布式作业调度系统
Mar 14 Python
python安装oracle扩展及数据库连接方法
Feb 21 Python
python 设置文件编码格式的实现方法
Dec 21 Python
解决python通过cx_Oracle模块连接Oracle乱码的问题
Oct 18 Python
对pandas的层次索引与取值的新方法详解
Nov 06 Python
python实现随机漫步方法和原理
Jun 10 Python
解决Keras中循环使用K.ctc_decode内存不释放的问题
Jun 29 Python
python使用opencv resize图像不进行插值的操作
Jul 05 Python
Python操作MySQL数据库的示例代码
Jul 13 Python
详解基于Facecognition+Opencv快速搭建人脸识别及跟踪应用
Jan 21 Python
python神经网络学习 使用Keras进行回归运算
May 04 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 jq jquery getJSON跨域提交数据完整版
2013/09/13 PHP
浅谈JavaScript中面向对象技术的模拟
2006/09/25 Javascript
jQuery学习笔记之jQuery选择器的使用
2010/12/22 Javascript
浅析javascript 定时器
2014/12/23 Javascript
详解JavaScript数组的操作大全
2015/10/19 Javascript
基于BootStrap Metronic开发框架经验小结【二】列表分页处理和插件JSTree的使用
2016/05/12 Javascript
AngularJS基础 ng-keydown 指令简单示例
2016/08/02 Javascript
JS中使用mailto实现将用户在网页中输入的内容传递到本地邮件客户端
2016/10/08 Javascript
jQuery中$.ajax()方法参数解析
2016/10/22 Javascript
JavaScript将base64图片转换成formData并通过AJAX提交的实现方法
2016/10/24 Javascript
jQuery控制控件文本的长度的操作方法
2016/12/05 Javascript
使用vue.js实现联动效果的示例代码
2017/01/10 Javascript
微信小程序通过api接口将json数据展现到小程序示例
2017/01/20 Javascript
基于jQuery实现咖啡订单管理简单应用
2017/02/10 Javascript
Bootstrap modal只加载一次数据的解决办法(推荐)
2017/11/24 Javascript
vue项目前端埋点的实现
2019/03/06 Javascript
vue+egg+jwt实现登录验证的示例代码
2019/05/18 Javascript
微信小程序中如何计算距离某个节日还有多少天
2019/07/15 Javascript
Vue 3.0 前瞻Vue Function API新特性体验
2019/08/12 Javascript
koa中间件核心(koa-compose)源码解读分析
2020/06/15 Javascript
JavaScript实现滑块验证解锁
2021/01/07 Javascript
python网络编程学习笔记(三):socket网络服务器
2014/06/09 Python
在Python3中使用asyncio库进行快速数据抓取的教程
2015/04/02 Python
Python进行数据提取的方法总结
2016/08/22 Python
使用python遍历指定城市的一周气温
2017/03/31 Python
python脚本替换指定行实现步骤
2017/07/11 Python
Python中使用pypdf2合并、分割、加密pdf文件的代码详解
2019/05/21 Python
python利用文件时间批量重命名照片和视频
2021/02/09 Python
详解基于 Canvas 手撸一个六边形能力图
2019/09/02 HTML / CSS
英国豪华针织品牌John Smedley的在线销售商:The Outlet by John Smedley
2018/04/08 全球购物
城市观光通行证:The Sightseeing Pass
2018/04/28 全球购物
采购主管工作职责
2013/12/12 职场文书
安全生产大检查方案
2014/05/07 职场文书
空气环保标语
2014/06/12 职场文书
乡镇爱国卫生月活动总结
2014/06/25 职场文书
整改通知书格式
2015/04/22 职场文书