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编写Logistic逻辑回归
Dec 30 Python
python3.5+tesseract+adb实现西瓜视频或头脑王者辅助答题
Jan 17 Python
python url 参数修改方法
Dec 26 Python
pyinstaller打包opencv和numpy程序运行错误解决
Aug 16 Python
Python中 CSV格式清洗与转换的实例代码
Aug 29 Python
Python json读写方式和字典相互转化
Apr 18 Python
python如何调用字典的key
May 25 Python
Python用K-means聚类算法进行客户分群的实现
Aug 23 Python
PyTorch如何搭建一个简单的网络
Aug 24 Python
解决Python安装cryptography报错问题
Sep 03 Python
详解Python模块化编程与装饰器
Jan 16 Python
Python字符串常规操作小结
Apr 03 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文件锁定写入实例解析
2014/07/14 PHP
thinkPHP实现瀑布流的方法
2014/11/29 PHP
js代码实现微博导航栏
2015/07/30 PHP
教你识别简单的免查杀PHP后门
2015/09/13 PHP
Yii框架中sphinx索引配置方法解析
2016/10/18 PHP
php基于dom实现的图书xml格式数据示例
2017/02/03 PHP
用JS判别浏览器种类以及IE版本的几种方法小结
2011/08/02 Javascript
js实现图片轮换效果代码
2013/04/16 Javascript
Js 代码中,ajax请求地址后加随机数防止浏览器缓存的原因
2013/05/07 Javascript
js处理表格对table进行修饰
2014/05/26 Javascript
BootStrap实现手机端轮播图左右滑动事件
2016/10/13 Javascript
微信小程序 自己制作小组件实例详解
2016/12/22 Javascript
利用node实现一个批量重命名文件的函数
2017/12/21 Javascript
关于vue的语法规则检测报错问题的解决
2018/05/21 Javascript
5分钟快速看懂ES6中的反射与代理
2019/12/19 Javascript
vue结合el-upload实现腾讯云视频上传功能
2020/07/01 Javascript
vue axios请求成功却进入catch的原因分析
2020/09/08 Javascript
[05:15]2018年度CS GO社区贡献奖-完美盛典
2018/12/16 DOTA
python实现中文分词FMM算法实例
2015/07/10 Python
Python WXPY实现微信监控报警功能的代码
2017/10/20 Python
Python 和 JS 有哪些相同之处
2017/11/23 Python
Python使用Selenium+BeautifulSoup爬取淘宝搜索页
2018/02/24 Python
python numpy 部分排序 寻找最大的前几个数的方法
2018/06/27 Python
Django Rest framework解析器和渲染器详解
2019/07/25 Python
Django3.0 异步通信初体验(小结)
2019/12/04 Python
通过实例简单了解python yield使用方法
2020/08/06 Python
python 对一幅灰度图像进行直方图均衡化
2020/10/27 Python
Sandro法国官网:法国成衣品牌
2019/08/28 全球购物
学前教育专业毕业生自荐信
2013/10/03 职场文书
销售文员的岗位职责
2013/11/20 职场文书
致跳高运动员广播稿
2014/01/13 职场文书
建筑总经理岗位职责
2014/02/02 职场文书
群众路线对照检查材料
2014/09/22 职场文书
齐云山导游词
2015/02/06 职场文书
合作与交流自我评价
2015/03/09 职场文书
Python实现天气查询软件
2021/06/07 Python