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目录与文件名操作例子
Aug 28 Python
python中json格式数据输出的简单实现方法
Oct 31 Python
利用Python2下载单张图片与爬取网页图片实例代码
Dec 25 Python
Python3之文件读写操作的实例讲解
Jan 23 Python
Python统计纯文本文件中英文单词出现个数的方法总结【测试可用】
Jul 25 Python
pytorch使用Variable实现线性回归
May 21 Python
Python函数中参数是传递值还是引用详解
Jul 02 Python
python logging模块书写日志以及日志分割详解
Jul 22 Python
python 判断三个数字中的最大值实例代码
Jul 24 Python
Python交互式图形编程的实现
Jul 25 Python
Keras实现将两个模型连接到一起
May 23 Python
python获得命令行输入的参数的两种方式
Nov 02 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
apache+mysql+php+ssl服务器之完全安装攻略
2006/09/05 PHP
PHP中UNIX时间戳和日期间的转换与计算实例
2014/11/19 PHP
tp5递归 无限级分类详解
2019/10/18 PHP
jquery select选中的一个小问题
2009/10/11 Javascript
Extjs学习笔记之五 一个小细节renderTo和applyTo的区别
2010/01/07 Javascript
获得所有表单值的JQuery实现代码[IE暂不支持]
2012/05/24 Javascript
JS 实现图片直接下载示例代码
2013/07/22 Javascript
流量统计器如何鉴别C#:WebBrowser中伪造referer
2015/01/07 Javascript
老生常谈JQuery data方法的使用
2016/09/09 Javascript
微信小程序 表单Form实例详解(附源码)
2016/12/22 Javascript
thinkphp标签实现bootsrtap轮播carousel实例代码
2017/02/19 Javascript
Bootstrap按钮组简单实现代码
2017/03/06 Javascript
JavaScript运动框架 多物体任意值运动(三)
2017/05/17 Javascript
Ionic + Angular.js实现图片轮播的方法示例
2017/05/21 Javascript
使用jQuery实现购物车结算功能
2017/08/15 jQuery
基于JavaScript+HTML5 实现打地鼠小游戏逻辑流程图文详解(附完整代码)
2017/11/02 Javascript
Bootstrap实现翻页效果
2017/11/27 Javascript
深入浅出理解JavaScript闭包的功能与用法
2018/08/01 Javascript
配置node服务器并且链接微信公众号接口配置步骤详解
2019/06/21 Javascript
js中关于Blob对象的介绍与使用
2019/11/29 Javascript
[04:11]2014DOTA2国际邀请赛 CIS遗憾出局梦想不灭
2014/07/09 DOTA
解决python3爬虫无法显示中文的问题
2018/04/12 Python
对python的文件内注释 help注释方法
2018/05/23 Python
Tensorflow进行多维矩阵的拆分与拼接实例
2020/02/07 Python
基于python实现对文件进行切分行
2020/04/26 Python
python邮件中附加文字、html、图片、附件实现方法
2021/01/04 Python
video.js支持m3u8格式直播的实现示例
2020/05/20 HTML / CSS
阿巴庭院:Abba Patio
2019/06/18 全球购物
Rowdy Gentleman服装和配饰:美好时光
2019/09/24 全球购物
mysql有关权限的表都有哪几个
2015/04/22 面试题
酒店门卫岗位职责
2013/12/29 职场文书
经典演讲稿汇总
2014/05/19 职场文书
全国助残日活动总结
2015/05/11 职场文书
小学生法制教育心得体会
2016/01/14 职场文书
php双向队列实例讲解
2021/11/17 PHP
mysql分组后合并显示一个字段的多条数据方式
2022/01/22 MySQL