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控制多进程与多线程并发数总结
Oct 26 Python
python实现简单淘宝秒杀功能
May 03 Python
pandas进行数据的交集与并集方式的数据合并方法
Jun 27 Python
基于数据归一化以及Python实现方式
Jul 11 Python
对pandas的层次索引与取值的新方法详解
Nov 06 Python
python笔记之mean()函数实现求取均值的功能代码
Jul 05 Python
python3.8与pyinstaller冲突问题的快速解决方法
Jan 16 Python
Django模板标签{% for %}循环,获取制定条数据实例
May 14 Python
python中rc1什么意思
Jun 19 Python
Python Selenium模块安装使用教程详解
Jul 09 Python
python 密码学示例——理解哈希(Hash)算法
Sep 21 Python
详解Python 3.10 中的新功能和变化
Apr 28 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
如何实现给定日期的若干天以后的日期
2006/10/09 PHP
用PHP程序实现支持页面后退的两种方法
2008/06/30 PHP
PHP数据库链接类(PDO+Access)实例分享
2013/12/05 PHP
php+mysqli使用预处理技术进行数据库查询的方法
2015/01/28 PHP
php计算到指定日期还有多少天的方法
2015/04/14 PHP
拖动Html元素集合 Drag and Drop any item
2006/12/22 Javascript
js调用flash的效果代码
2008/04/26 Javascript
Javascript remove 自定义数组删除方法
2009/10/20 Javascript
JS解决ie6下png透明的方法实例
2013/08/02 Javascript
jquery的live使用注意事项
2014/02/18 Javascript
angularjs实现与服务器交互分享
2014/06/24 Javascript
Javascript中prototype属性实现给内置对象添加新的方法
2015/05/14 Javascript
jquery带翻页动画的电子杂志代码分享
2015/08/21 Javascript
jquery.validate使用详解
2016/06/02 Javascript
Node.js环境下JavaScript实现单链表与双链表结构
2016/06/12 Javascript
Windows环境下npm install 报错: operation not permitted, rename的解决方法
2016/09/26 Javascript
Node.js包管理器Yarn的入门介绍与安装
2016/10/17 Javascript
浅谈javascript的url参数parse和build函数
2017/03/04 Javascript
ionic App问题总结系列之ionic点击系统返回键退出App
2017/08/19 Javascript
JavaScript中关于class的调用方法
2017/11/28 Javascript
JS常用的几种数组遍历方式以及性能分析对比实例详解
2018/04/11 Javascript
深入理解Python中装饰器的用法
2016/06/28 Python
python调用matplotlib模块绘制柱状图
2019/10/18 Python
tensorflow 限制显存大小的实现
2020/02/03 Python
Python使用type动态创建类操作示例
2020/02/29 Python
宝拉珍选英国官网:Paula’s Choice英国
2019/05/29 全球购物
阿姆斯特丹城市卡:Amsterdam Pass
2019/12/01 全球购物
用C或者C++语言实现SOCKET通信
2015/02/24 面试题
化工工艺专业求职信
2013/09/22 职场文书
2014应届本科生自我评价
2014/09/13 职场文书
道路交通事故赔偿协议书
2014/10/24 职场文书
南湾猴岛导游词
2015/02/09 职场文书
党校学习个人总结
2015/02/15 职场文书
2015暑期社会实践个人总结
2015/07/13 职场文书
利用Python实现Picgo图床工具
2021/11/23 Python
苹果macOS 13开发者预览版Beta 8发布 正式版10月发布
2022/09/23 数码科技