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实现SMTP发送邮件详细教程
Mar 02 Python
一百多行python代码实现抢票助手
Sep 25 Python
python 判断字符串中是否含有汉字或非汉字的实例
Jul 15 Python
Python实现一个数组除以一个数的例子
Jul 20 Python
Django Admin中增加导出Excel功能过程解析
Sep 04 Python
Flask中endpoint的理解(小结)
Dec 11 Python
下载与当前Chrome对应的chromedriver.exe(用于python+selenium)
Jan 14 Python
浅谈Python中文件夹和python package包的区别
Jun 01 Python
Python实现SMTP邮件发送
Jun 16 Python
python 生成器需注意的小问题
Sep 29 Python
sublime3之内网安装python插件Anaconda的流程
Nov 10 Python
python 动态渲染 mysql 配置文件的示例
Nov 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
php分页函数
2006/07/08 PHP
使用sockets:从新闻组中获取文章(一)
2006/10/09 PHP
php递归创建和删除文件夹的代码小结
2012/04/13 PHP
php更新修改excel中的内容实例代码
2014/02/26 PHP
windows下配置apache+php+mysql时出现问题的处理方法
2014/06/20 PHP
php socket客户端及服务器端应用实例
2014/07/04 PHP
PHP获取当前所在目录位置的方法
2014/11/26 PHP
PHP图像处理类库及演示分享
2015/05/17 PHP
PHP中串行化用法示例
2016/11/16 PHP
PHP 文件锁与进程锁的使用示例
2017/08/07 PHP
Smarty模板变量与调节器实例详解
2019/07/20 PHP
syntaxhighlighter 使用方法
2007/07/02 Javascript
大家未必知道的Js技巧收藏
2008/04/07 Javascript
Javascript中Eval函数的使用
2010/03/23 Javascript
JavaScript 保存数组到Cookie的代码
2010/04/14 Javascript
教您去掉ie网页加载进度条的方法
2010/12/09 Javascript
深入浅析react native es6语法
2015/12/09 Javascript
三分钟带你玩转jQuery.noConflict()
2016/02/15 Javascript
原生javascript实现解析XML文档与字符串
2016/03/01 Javascript
使用plupload自定义参数实现多文件上传
2016/07/19 Javascript
关于angularJs指令的Scope(作用域)介绍
2016/10/25 Javascript
基于JS实现9种不同的面包屑和分布式多步骤导航效果
2017/02/21 Javascript
react.js CMS 删除功能的实现方法
2017/04/17 Javascript
利用node.js写一个爬取知乎妹纸图的小爬虫
2017/05/03 Javascript
Vue.js的动态组件模板的实现
2018/11/26 Javascript
layui自定义插件citySelect实现省市区三级联动选择
2019/07/26 Javascript
Weex开发之地图篇的具体使用
2019/10/16 Javascript
使用Python获取Linux系统的各种信息
2014/07/10 Python
简单实现python爬虫功能
2015/12/31 Python
python生成词云的实现方法(推荐)
2017/06/13 Python
Otticanet英国:最顶尖的世界名牌眼镜, 能得到打折季的价格
2019/02/10 全球购物
金蝶的一道SQL笔试题
2012/12/18 面试题
STP的判定过程
2012/10/01 面试题
初一体育教学反思
2014/01/29 职场文书
优秀教师个人总结
2015/02/11 职场文书
Python基础之数据结构详解
2021/04/28 Python