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 相关文章推荐
Python2.x和3.x下maketrans与translate函数使用上的不同
Apr 13 Python
Python切片知识解析
Mar 06 Python
django限制匿名用户访问及重定向的方法实例
Feb 07 Python
Python框架Flask的基本数据库操作方法分析
Jul 13 Python
Python并发:多线程与多进程的详解
Jan 24 Python
Django中的session用法详解
Mar 09 Python
Python模块相关知识点小结
Mar 09 Python
linux 下selenium chrome使用详解
Apr 02 Python
tensorflow模型文件(ckpt)转pb文件的方法(不知道输出节点名)
Apr 22 Python
Python unittest生成测试报告过程解析
Sep 08 Python
Python字符串及文本模式方法详解
Sep 10 Python
如何使用Python自动生成报表并以邮件发送
Oct 15 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 操作excel文件的方法小结
2009/12/31 PHP
PHP判断远程url是否有效的几种方法小结
2011/10/08 PHP
php实现批量下载百度云盘文件例子分享
2014/04/10 PHP
zend framework框架中url大小写问题解决方法
2014/08/19 PHP
thinkphp3.x自定义Action、Model及View的简单实现方法
2016/05/19 PHP
php常用字符串String函数实例总结【转换,替换,计算,截取,加密】
2016/12/07 PHP
php写app接口并返回json数据的实例(分享)
2017/05/20 PHP
PHP递归统计系统中代码行数
2019/09/19 PHP
Javascript MVC框架Backbone.js详解
2014/09/18 Javascript
node.js中的path.dirname方法使用说明
2014/12/09 Javascript
jQuery实现感应鼠标动画效果自动伸长的输入框实例
2015/02/24 Javascript
JS实现黑色风格的网页TAB选项卡效果代码
2015/10/09 Javascript
JavaScript的Backbone.js框架环境搭建及Hellow world示例
2016/05/07 Javascript
js实现目录链接,内容跟着目录滚动显示的简单实例
2016/10/15 Javascript
jquery-mobile表单的创建方法详解
2016/11/23 Javascript
JavaScript给每一个li节点绑定点击事件的实现方法
2016/12/01 Javascript
Bootstrap标签页(Tab)插件使用方法
2017/03/21 Javascript
微信小程序实现长按删除图片的示例
2018/05/18 Javascript
如何解决js函数防抖、节流出现的问题
2019/06/17 Javascript
解决layui追加或者动态修改的表单元素“没效果”的问题
2019/09/18 Javascript
[00:35]可解锁地面特效
2018/12/20 DOTA
[39:19]完美世界DOTA2联赛PWL S2 SZ vs LBZS 第二场 11.26
2020/11/30 DOTA
Python数据类型详解(三)元祖:tuple
2016/05/08 Python
Python使用PyCrypto实现AES加密功能示例
2017/05/22 Python
Python3学习urllib的使用方法示例
2017/11/29 Python
django 修改server端口号的方法
2018/05/14 Python
Python基于递归和非递归算法求两个数最大公约数、最小公倍数示例
2018/05/21 Python
python抖音表白程序源代码
2019/04/07 Python
使用html5新特性轻松监听任何App自带返回键的示例
2018/03/13 HTML / CSS
美国修容界大佬创建的个人美妆品牌:Kevyn Aucoin Beauty
2018/12/12 全球购物
C/C++ 笔试、面试题目大汇总
2015/11/21 面试题
篮球比赛拉拉队口号
2014/06/10 职场文书
加强机关作风建设心得体会
2014/10/22 职场文书
整改报告格式
2014/11/06 职场文书
Oracle创建只读账号的详细步骤
2021/06/07 Oracle
tomcat下部署jenkins的方法
2022/05/06 Servers