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 相关文章推荐
vc6编写python扩展的方法分享
Jan 17 Python
Python自动连接ssh的方法
Mar 07 Python
浅谈Python的文件类型
May 30 Python
Python使用迭代器捕获Generator返回值的方法
Apr 05 Python
浅谈Python实现2种文件复制的方法
Jan 19 Python
python使用tornado实现简单爬虫
Jul 28 Python
Python批处理更改文件名os.rename的方法
Oct 26 Python
python 实现视频流下载保存MP4的方法
Jan 09 Python
python turtle库画一个方格和圆实例
Jun 27 Python
Python 元组操作总结
Sep 18 Python
Python字符串格式化f-string多种功能实现
May 07 Python
Django如何使用redis作为缓存
May 21 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
人族 Terran 基本策略
2020/03/14 星际争霸
PHP 数组实例说明
2008/08/18 PHP
php常用Stream函数集介绍
2013/06/24 PHP
服务器上配置PHP运行环境教程
2015/02/12 PHP
Symfony2联合查询实现方法
2016/03/18 PHP
php文件操作小结(删除指定文件/获取文件夹下的文件名/读取文件夹下图片名)
2016/05/09 PHP
准确获得页面、窗口高度及宽度的JS
2006/11/26 Javascript
客户端脚本中常常出现的一些问题和调试技巧
2007/01/09 Javascript
jQuery分别获取选中的复选框值的示例
2014/06/17 Javascript
JS for循环中i++ 和 ++i的区别介绍
2016/07/20 Javascript
web.js.字符串与正则表达式操作
2017/05/13 Javascript
浅谈js中的this问题
2017/08/31 Javascript
AngularJS自定义过滤器用法经典实例总结
2018/05/17 Javascript
jQuery阻止事件冒泡实例分析
2018/07/03 jQuery
node.js使用yargs处理命令行参数操作示例
2020/02/11 Javascript
文章或博客自动生成章节目录索引(支持三级)的实现代码
2020/05/10 Javascript
详解vue 组件
2020/06/11 Javascript
[50:11]2018DOTA2亚洲邀请赛 4.7总决赛 LGD vs Mineski 第三场
2018/04/09 DOTA
用python分割TXT文件成4K的TXT文件
2009/05/23 Python
python获得文件创建时间和修改时间的方法
2015/06/30 Python
python实现井字棋游戏
2020/03/30 Python
Python tkinter的grid布局及Text动态显示方法
2018/10/11 Python
对Python中Iterator和Iterable的区别详解
2018/10/18 Python
pygame游戏之旅 添加游戏暂停功能
2018/11/21 Python
python程序快速缩进多行代码方法总结
2019/06/23 Python
使用Python实现跳一跳自动跳跃功能
2019/07/10 Python
利用setuptools打包python程序的方法步骤
2020/01/18 Python
Python 读取WAV音频文件 画频谱的实例
2020/03/14 Python
Python sorted排序方法如何实现
2020/03/31 Python
python字符串的index和find的区别详解
2020/06/20 Python
专注澳大利亚特产和新西兰特产的澳洲中文网:0061澳洲制造
2019/03/24 全球购物
会计专业自我鉴定范文
2013/12/29 职场文书
社保代办委托书怎么写
2014/10/06 职场文书
大学生村官驻村工作心得体会
2016/01/23 职场文书
带你学习MySQL执行计划
2021/05/31 MySQL
nginx从安装到配置详细说明(安装,安全配置,防盗链,动静分离,配置 HTTPS,性能优化)
2022/02/12 Servers