Python多个装饰器的调用顺序实例解析


Posted in Python onMay 22, 2020

一般情况下,在函数中可以使用一个装饰器,但是有时也会有两个或两个以上的装饰器。多个装饰器装饰的顺序是从里到外(就近原则),而调用的顺序是从外到里(就远原则)

样例:

def func1(func):
  print(1)
  def inner1(*args, **kwargs):
    print(2)
    res = func(*args, **kwargs)
    print(3)
    return res
  print(4)
  return inner
 
def func2(func):
  print(5)
  def inner2(*args, **kwargs):
    print(6)
    res = func(*args, **kwargs)
    print(7)
    return res
  print(8)
  return inner<br data-filtered="filtered">
@func1
@func2
def go():
  print("running..")<br data-filtered="filtered">go()

 其实函数go的执行本质是如下:

  • a=func2(go);a的内容为inner2函数的函数地址;因此输出的内容为5,8两个值
  • b=func1(a);b的内容为inner1函数的函数地址,因此输出的内容为1,4两个值
  • b();执行inner1()函数,里面的func的值为inner2,而inner2里面的func的值为go,因此输出的内容,因此为2,6,running,7,3

即b(func1(func2(go)))()

等同如下效果:

a=func2(go);a的内容为inner2函数的函数地址;因此输出的内容为5,8两个值

go=func1(a);此处的go是一个新变量,而非go函数的标识,go的内容为inner1函数的函数地址,因此输出的内容为1,4两个值

go();执行inner1()函数,里面的func的值为inner2,而inner2里面的func的值为真正定义的go函数地址,因此输出的内容,因此为2,6,running,7,3

即go(func1(func2(go)))()

实测结果:

C:\Python27\python.exe D:/code-program/lianxi-test/route.py
5
8
1
4
2
6
running..
7
3
 
Process finished with exit code 0

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

Python 相关文章推荐
Python中threading模块join函数用法实例分析
Jun 04 Python
fastcgi文件读取漏洞之python扫描脚本
Apr 23 Python
基于python实现聊天室程序
Jul 27 Python
使用 Visual Studio Code(VSCode)搭建简单的Python+Django开发环境的方法步骤
Dec 17 Python
python 实现UTC时间加减的方法
Dec 31 Python
在Pycharm中对代码进行注释和缩进的方法详解
Jan 20 Python
Python如何爬取微信公众号文章和评论(基于 Fiddler 抓包分析)
Jun 28 Python
Numpy 中的矩阵求逆实例
Aug 26 Python
tensorflow 实现数据类型转换
Feb 17 Python
在Django中自定义filter并在template中的使用详解
May 19 Python
通过实例解析python and和or使用方法
Nov 14 Python
【超详细】八大排序算法的各项比较以及各自特点
Mar 31 Python
基于Python第三方插件实现西游记章节标注汉语拼音的方法
May 22 #Python
Tensorflow tf.tile()的用法实例分析
May 22 #Python
python代码实现将列表中重复元素之间的内容全部滤除
May 22 #Python
Tensorflow实现将标签变为one-hot形式
May 22 #Python
Python selenium爬取微博数据代码实例
May 22 #Python
python实现文法左递归的消除方法
May 22 #Python
使用Django搭建网站实现商品分页功能
May 22 #Python
You might like
[转帖]PHP世纪万年历
2006/12/06 PHP
深入PHP empty(),isset(),is_null()的实例测试详解
2013/06/06 PHP
php删除数组中重复元素的方法
2015/12/22 PHP
PHP在线打包下载功能示例
2016/10/15 PHP
PHP链表操作简单示例
2016/10/15 PHP
PHP判断一个数组是另一个数组子集的方法详解
2017/07/31 PHP
Nginx+php配置文件及原理解析
2020/12/09 PHP
jquery 获取自定义属性(attr和prop)的实现代码
2012/06/27 Javascript
Js base64 加密解密介绍
2013/10/11 Javascript
js 事件截取enter按键页面提交事件示例代码
2014/03/04 Javascript
将HTML的左右尖括号等转义成实体形式的两种实现方式
2014/05/04 Javascript
JS iFrame加载慢怎么解决
2016/05/13 Javascript
javascript中sort排序实例详解
2016/07/24 Javascript
原生js验证简洁注册登录页面
2016/12/17 Javascript
原生js实现类似fullpage的单页/全屏滚动
2017/01/22 Javascript
Webpack中css-loader和less-loader的使用教程
2017/04/27 Javascript
浅谈Vue.js应用的四种AJAX请求数据模式
2017/08/30 Javascript
for循环 + setTimeout 结合一些示例(前端面试题)
2017/08/30 Javascript
vue 添加vux的代码讲解
2017/11/30 Javascript
vue解决使用webpack打包后keep-alive不生效的方法
2018/09/01 Javascript
详细讲解如何创建, 发布自己的 Vue UI 组件库
2019/05/29 Javascript
[23:21]Ti4 冒泡赛第二轮DK vs C9 2
2014/07/14 DOTA
Python基于sftp及rsa密匙实现远程拷贝文件的方法
2016/09/21 Python
python处理Excel xlrd的简单使用
2017/09/12 Python
PyQt5主窗口动态加载Widget实例代码
2018/02/07 Python
Python通过socketserver处理多个链接
2020/03/18 Python
Python super()函数使用及多重继承
2020/05/06 Python
python实现AHP算法的方法实例(层次分析法)
2020/09/09 Python
Surfdome西班牙:世界上最受欢迎的生活方式品牌
2019/02/13 全球购物
大学校园毕业自我鉴定
2014/01/15 职场文书
2014年银行员工年终自我评价
2014/09/19 职场文书
上甘岭观后感
2015/06/10 职场文书
关于运动会的广播稿
2015/08/19 职场文书
python使用pywinauto驱动微信客户端实现公众号爬虫
2021/05/19 Python
详解Spring Bean的配置方式与实例化
2022/06/10 Java/Android
Java实现简单小画板
2022/06/10 Java/Android