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中zip()方法应用实例分析
Apr 16 Python
深入理解python中的闭包和装饰器
Jun 12 Python
Python中is与==判断的区别
Mar 28 Python
ubuntu环境下python虚拟环境的安装过程
Jan 07 Python
Python基于OpenCV实现视频的人脸检测
Jan 23 Python
浅析Python装饰器以及装饰器模式
May 28 Python
更新修改后的Python模块方法
Mar 03 Python
解决python彩色螺旋线绘制引发的问题
Nov 23 Python
python之array赋值技巧分享
Nov 28 Python
浅谈pytorch中的BN层的注意事项
Jun 23 Python
python里反向传播算法详解
Nov 22 Python
python dir函数快速掌握用法技巧
Dec 09 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/02 无线电
PHP版网站缓存加快打开速度的方法分享
2012/06/03 PHP
php从数组中随机抽取一些元素的代码
2012/11/05 PHP
php 检查电子邮件函数(自写)
2014/01/16 PHP
composer.lock文件的作用
2016/02/03 PHP
PHP缓冲区用法总结
2016/02/14 PHP
PHP环境搭建(php+Apache+mysql)
2016/11/14 PHP
PHP 断点续传实例详解
2017/11/11 PHP
使用PHP开发留言板功能
2019/11/19 PHP
使用JavaScript switch case 另类写法
2010/03/14 Javascript
Javascript(AJAX)解析XML的代码(兼容FIREFOX/IE)
2010/07/11 Javascript
基于jquery实现的鼠标滑过按钮改变背景图片
2011/07/15 Javascript
Bootstrap中表单控件状态(验证状态)
2016/08/04 Javascript
js实现弹窗居中的简单实例
2016/10/09 Javascript
使用vue实现点击按钮滑出面板的实现代码
2017/01/10 Javascript
jQuery监听浏览器窗口大小的变化实例
2017/02/07 Javascript
详解Angular 4.x Injector
2017/05/04 Javascript
es6 filter() 数组过滤方法总结
2019/04/03 Javascript
Vue中添加滚动事件设置的方法详解
2020/09/14 Javascript
JavaScript 实现拖拽效果组件功能(兼容移动端)
2020/11/11 Javascript
Python实现曲线点抽稀算法的示例
2017/10/12 Python
Python实现的选择排序算法原理与用法实例分析
2017/11/22 Python
python回调函数中使用多线程的方法
2017/12/25 Python
python中virtualenvwrapper安装与使用
2018/05/20 Python
Pandas的read_csv函数参数分析详解
2019/07/02 Python
python3.7 openpyxl 删除指定一列或者一行的代码
2019/10/08 Python
使用NumPy读取MNIST数据的实现代码示例
2019/11/20 Python
Python爬虫获取页面所有URL链接过程详解
2020/06/04 Python
解决python 在for循环并且pop数组的时候会跳过某些元素的问题
2020/12/11 Python
Carter’s官方旗舰店:美国受欢迎的婴童服装品牌
2018/01/21 全球购物
Kappa英国官方在线商店:服装和运动器材
2020/11/22 全球购物
工厂仓管员岗位职责
2014/01/01 职场文书
迟到检讨书大全
2014/01/25 职场文书
超越自我演讲稿
2014/05/21 职场文书
结对共建协议书
2014/08/20 职场文书
2015年商场工作总结
2015/04/27 职场文书