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字符串格式化
Jun 15 Python
PyQt5实现下载进度条效果
Apr 19 Python
python 常用的基础函数
Jul 10 Python
Python/ArcPy遍历指定目录中的MDB文件方法
Oct 27 Python
详解Python读取yaml文件多层菜单
Mar 23 Python
解决python3 requests headers参数不能有中文的问题
Aug 21 Python
对Python中一维向量和一维向量转置相乘的方法详解
Aug 26 Python
python实现简单颜色识别程序
Feb 19 Python
python GUI库图形界面开发之PyQt5工具栏控件QToolBar的详细使用方法与实例
Feb 28 Python
Python爬虫:Request Payload和Form Data的简单区别说明
Apr 30 Python
python连接mysql数据库并读取数据的实现
Sep 25 Python
python使用glob检索文件的操作
May 20 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
咖啡知识 除了喝咖啡还有那些知识点
2021/03/06 新手入门
一个可查询所有表的“通用”查询分页类
2006/10/09 PHP
我的论坛源代码(九)
2006/10/09 PHP
自己在做项目过程中学到的PHP知识收集
2012/08/20 PHP
用PHP提取中英文词语以及数字的首字母的方法介绍
2013/04/23 PHP
php无限极分类实现的两种解决方法
2013/04/28 PHP
php模板原理讲解
2013/11/13 PHP
实例分析PHP中PHPMailer发邮件
2017/12/13 PHP
如何取得中文输入的真实长度?
2006/06/24 Javascript
网页里控制图片大小的相关代码
2006/06/25 Javascript
jquery 学习之二 属性相关
2010/11/23 Javascript
Js操作Select大全(取值、设置选中等等)
2013/10/29 Javascript
做好七件事帮你提升jQuery的性能
2014/02/06 Javascript
SyntaxHighlighter 3.0.83使用笔记
2015/01/26 Javascript
JavaScript实现将xml转换成html table表格的方法
2015/04/17 Javascript
Bootstrap每天必学之进度条
2015/11/30 Javascript
Bootstrap Paginator分页插件与ajax相结合实现动态无刷新分页效果
2016/05/27 Javascript
AngularJS基础 ng-keyup 指令简单示例
2016/08/02 Javascript
通过扫描二维码打开app的实现代码
2016/11/10 Javascript
Angularjs 动态改变title标题(兼容ios)
2016/12/29 Javascript
JavaScript数据结构之二叉查找树的定义与表示方法
2017/04/12 Javascript
Vue编写多地区选择组件
2017/08/21 Javascript
Vue项目实现简单的权限控制管理功能
2019/07/17 Javascript
浅谈vue限制文本框输入数字的正确姿势
2019/09/02 Javascript
Python多线程结合队列下载百度音乐的方法
2015/07/27 Python
python基于itchat实现微信群消息同步机器人
2017/02/27 Python
python写入已存在的excel数据实例
2018/05/03 Python
python实现文件助手中查看微信撤回消息
2019/04/29 Python
python+Django+pycharm+mysql 搭建首个web项目详解
2019/11/29 Python
小班秋游活动方案
2014/02/22 职场文书
人事代理委托书
2014/09/27 职场文书
劳动保障事务所个人工作总结
2015/08/12 职场文书
《7的乘法口诀》教学反思
2016/02/18 职场文书
Python进程间的通信之语法学习
2022/04/11 Python
JS前端监控采集用户行为的N种姿势
2022/07/23 Javascript
Spring boot实现上传文件到本地服务器
2022/08/14 Java/Android