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 pdb调试方法分享
Jan 21 Python
wxpython 最小化到托盘与欢迎图片的实现方法
Jun 09 Python
python多线程操作实例
Nov 21 Python
在Python中pandas.DataFrame重置索引名称的实例
Nov 06 Python
python re库的正则表达式入门学习教程
Mar 08 Python
为什么你还不懂得怎么使用Python协程
May 13 Python
10款最好的Python开发编辑器
Jul 03 Python
python 消除 futureWarning问题的解决
Dec 25 Python
基于h5py的使用及数据封装代码
Dec 26 Python
python GUI库图形界面开发之PyQt5开发环境配置与基础使用
Feb 25 Python
python中类与对象之间的关系详解
Dec 16 Python
python 邮件检测工具mmpi的使用
Jan 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 获取远程文件内容的函数代码
2010/03/24 PHP
PHP 缓存实现代码及详细注释
2010/05/16 PHP
php删除与复制文件夹及其文件夹下所有文件的实现代码
2013/01/23 PHP
从wamp到xampp的升级之路
2015/04/08 PHP
php上传大文件设置方法
2016/04/14 PHP
在JavaScript中实现命名空间
2006/11/23 Javascript
JQery 渐变图片导航效果代码 漂亮
2010/01/01 Javascript
异步加载script的代码
2011/01/12 Javascript
javascript判断是手机还是电脑访问网页的简单实例分享
2014/06/03 Javascript
JavaScript运动减速效果实例分析
2015/08/04 Javascript
javascript自动恢复文本框点击清除后的默认文本
2016/01/12 Javascript
JavaScript判断是否是微信浏览器
2016/06/13 Javascript
微信小程序之分享页面如何返回首页的示例
2018/03/28 Javascript
深入浅析Vue中的Prop
2018/06/10 Javascript
vue 的点击事件获取当前点击的元素方法
2018/09/15 Javascript
使用vue2实现带地区编号和名称的省市县三级联动效果
2018/11/05 Javascript
详解小程序rich-text对富文本支持方案
2018/11/28 Javascript
原生JS实现的跳一跳小游戏完整实例
2019/01/27 Javascript
送你43道JS面试题(收藏)
2019/06/17 Javascript
微信小程序用户授权、位置授权及获取微信绑定手机号
2019/07/18 Javascript
微信小程序自定义顶部组件customHeader的示例代码
2020/06/03 Javascript
vue实现动态给id赋值,点击事件获取当前点击的元素的id操作
2020/11/09 Javascript
解决vue下载后台传过来的乱码流的问题
2020/12/05 Vue.js
对python-3-print重定向输出的几种方法总结
2018/05/11 Python
用python实现k近邻算法的示例代码
2018/09/06 Python
Django+JS 实现点击头像即可更改头像的方法示例
2018/12/26 Python
python变量赋值方法(可变与不可变)
2019/01/12 Python
基于腾讯云服务器部署微信小程序后台服务(Python+Django)
2019/05/08 Python
Pandas库之DataFrame使用的学习笔记
2019/06/21 Python
pyinstaller打包找不到文件的问题解决
2020/04/15 Python
英国创新设计文具、卡片和礼品包装网站:Paperchase
2018/07/14 全球购物
Ryderwear澳洲官网:澳大利亚高端健身训练装备品牌
2018/09/18 全球购物
会计试用期自我评价怎么写
2014/09/18 职场文书
报名委托书
2015/01/29 职场文书
《坐井观天》教学反思
2016/02/18 职场文书
如何写好开幕词?
2019/06/24 职场文书