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中实现php的var_dump函数功能
Jan 21 Python
Python实现简单的可逆加密程序实例
Mar 05 Python
Python中的pass语句使用方法讲解
May 14 Python
Python程序中的观察者模式结构编写示例
May 27 Python
Python中list查询及所需时间计算操作示例
Jun 21 Python
python numpy 一维数组转变为多维数组的实例
Jul 02 Python
Python日期时间模块datetime详解与Python 日期时间的比较,计算实例代码
Sep 14 Python
pycharm远程开发项目的实现步骤
Jan 20 Python
pycharm2020.2 配置使用的方法详解
Sep 16 Python
pycharm 实现复制一行的快捷键
Jan 15 Python
python中最小二乘法详细讲解
Feb 19 Python
python必学知识之文件操作(建议收藏)
May 30 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 获取当前访问的url文件名的方法小结
2010/02/08 PHP
几种有用的变型 PHP中循环语句的用法介绍
2012/01/30 PHP
php中jQuery插件autocomplate的简单使用笔记
2012/06/14 PHP
php设置允许大文件上传示例代码
2014/03/10 PHP
php数组索引的Key加引号和不加引号的区别
2014/08/19 PHP
8个PHP程序员常用的功能汇总
2014/12/18 PHP
php数据访问之查询关键字
2016/05/09 PHP
PHPCrawl爬虫库实现抓取酷狗歌单的方法示例
2017/12/21 PHP
ThinkPHP 框架实现的读取excel导入数据库操作示例
2020/04/14 PHP
JS弹出层单纯的绝对定位居中示例代码
2014/02/18 Javascript
JavaScript两种跨域技术全面介绍
2014/04/16 Javascript
jquery中JSON的解析方式
2015/03/16 Javascript
javascript中eval函数用法分析
2015/04/25 Javascript
基于jQuery实现仿51job城市选择功能实例代码
2016/03/02 Javascript
Javascript实现找不同色块的游戏
2017/07/17 Javascript
详解ES6之async+await 同步/异步方案
2017/09/19 Javascript
Vue from-validate 表单验证的示例代码
2017/09/26 Javascript
使用selenium抓取淘宝的商品信息实例
2018/02/06 Javascript
解决微信浏览器缓存站点入口文件(IIS部署Vue项目)
2019/06/17 Javascript
使用p5.js临摹动态图形
2019/10/23 Javascript
微信小程序表单验证WxValidate的使用
2019/11/27 Javascript
[05:31]DOTA2英雄梦之声_第04期_光之守卫
2014/06/23 DOTA
Python 字典dict使用介绍
2014/11/30 Python
Python使用迭代器打印螺旋矩阵的思路及代码示例
2016/07/02 Python
Python实现的异步代理爬虫及代理池
2017/03/17 Python
Python实现类的创建与使用方法示例
2017/07/25 Python
numpy中以文本的方式存储以及读取数据方法
2018/06/04 Python
python ETL工具 pyetl
2020/06/07 Python
HTML5 在canvas中绘制文本附效果图
2014/06/23 HTML / CSS
瑞士香水购物网站:Parfumcity.ch
2017/01/14 全球购物
《孔子游春》教学反思
2014/02/25 职场文书
《放飞蜻蜓》教学反思
2014/04/27 职场文书
市级三好学生评语
2014/12/29 职场文书
仓库统计员岗位职责
2015/04/14 职场文书
2015年度公共机构节能工作总结
2015/05/26 职场文书
Apache SkyWalking 监控 MySQL Server 实战解析
2022/09/23 Servers