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实现系统状态监测和故障转移实例方法
Nov 18 Python
利用Python实现图书超期提醒
Aug 02 Python
Python 基于Twisted框架的文件夹网络传输源码
Aug 28 Python
高质量Python代码编写的5个优化技巧
Nov 16 Python
python邮件发送smtplib使用详解
Jun 16 Python
Python文件循环写入行时防止覆盖的解决方法
Nov 09 Python
对python requests发送json格式数据的实例详解
Dec 19 Python
Python数据类型之Tuple元组实例详解
May 08 Python
Python的几种主动结束程序方式
Nov 22 Python
python3 配置logging日志类的操作
Apr 08 Python
Python 实现自动完成A4标签排版打印功能
Apr 09 Python
Python自动化实战之接口请求的实现
May 30 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 购物车的例子
2009/05/04 PHP
php编程实现获取excel文档内容的代码实例
2011/06/28 PHP
php中3种方法统计字符串中每种字符的个数并排序
2012/08/27 PHP
php遍历目录与文件夹的多种方法详解
2013/11/14 PHP
深入理解PHP类的自动载入机制
2016/09/16 PHP
PHP对称加密算法(DES/AES)类的实现代码
2017/11/14 PHP
TP5.0框架实现无限极回复功能的方法分析
2019/05/04 PHP
详解PHP 7.4 中数组延展操作符语法知识点
2019/07/19 PHP
jQuery中[attribute*=value]选择器用法实例
2014/12/31 Javascript
浅谈Javascript中substr和substring的区别
2015/09/30 Javascript
Node.js + Redis Sorted Set实现任务队列
2016/09/19 Javascript
jquery获取点击控件的绝对位置简单实例
2016/10/13 Javascript
JS设置手机验证码60s等待实现代码
2017/06/14 Javascript
深入理解React Native原生模块与JS模块通信的几种方式
2017/07/24 Javascript
基于js粘贴事件paste简单解析以及遇到的坑
2017/09/07 Javascript
NodeJS如何实现同步的方法示例
2018/08/24 NodeJs
一文快速详解前端框架 Vue 最强大的功能
2019/05/21 Javascript
JavaScript如何获取一个元素的样式信息
2019/07/29 Javascript
[03:39]DOTA2英雄梦之声_第05期_幽鬼
2014/06/23 DOTA
[02:41]DOTA2亚洲邀请赛小组赛第三日 赛事回顾
2015/02/01 DOTA
Python引用类型和值类型的区别与使用解析
2017/10/17 Python
python中的selenium安装的步骤(浏览器自动化测试框架)
2020/03/17 Python
Django模板获取field的verbose_name实例
2020/05/19 Python
css3高级选择器使用方法
2013/12/02 HTML / CSS
美赞臣营养马来西亚旗舰店:Enfagrow马来西亚
2019/07/26 全球购物
百度JavaScript笔试题
2015/01/15 面试题
物业管理求职自荐信
2013/09/25 职场文书
光电信息专业应届生求职信
2013/10/07 职场文书
对公司合理化的建议书
2014/03/12 职场文书
小学捐书活动总结
2014/07/05 职场文书
工会文体活动总结
2015/05/07 职场文书
六年级语文教学反思
2016/03/03 职场文书
「魔导具师妲莉亚永不妥协~从今天开始的自由职人生活~」1、2卷发售宣传CM公开
2022/03/21 日漫
动画《新网球王子 U-17 WORLD CUP》希腊队PV公开
2022/04/02 日漫
Python使用mitmproxy工具监控手机 下载手机小视频
2022/04/18 Python
Python 中面向接口编程
2022/05/20 Python