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高并发异步服务器核心库forkcore使用方法
Nov 26 Python
实例讲解Python中的私有属性
Aug 21 Python
Python cookbook(数据结构与算法)保存最后N个元素的方法
Feb 13 Python
python实现黑客字幕雨效果
Jun 21 Python
python 将对象设置为可迭代的两种实现方法
Jan 21 Python
python实现差分隐私Laplace机制详解
Nov 25 Python
Python监控服务器实用工具psutil使用解析
Dec 19 Python
django有外键关系的两张表如何相互查找
Feb 10 Python
tensorflow生成多个tfrecord文件实例
Feb 17 Python
jupyter 使用Pillow包显示图像时inline显示方式
Apr 24 Python
tensorflow实现残差网络方式(mnist数据集)
May 26 Python
python实现简单的聊天小程序
Jul 07 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/01 无线电
用PHP制作静态网站的模板框架(三)
2006/10/09 PHP
php开发过程中关于继承的使用方法分享
2011/06/17 PHP
PHP操作数组的一些函数整理介绍
2011/07/17 PHP
php检测网页是否被百度收录的函数代码
2013/10/09 PHP
总结一些PHP中好用但又容易忽略的小知识
2017/06/02 PHP
如果文字过长,则将过长的部分变成省略号显示
2006/06/26 Javascript
为javascript添加String.Format方法
2020/08/11 Javascript
通过action传过来的值在option获取进行验证的方法
2013/11/14 Javascript
jQuery实现数字加减效果汇总
2014/12/16 Javascript
JavaScript动态修改背景颜色的方法
2015/04/16 Javascript
javascript结合Flexbox简单实现滑动拼图游戏
2016/02/18 Javascript
原生js和jquery分别实现横向导航菜单效果
2016/05/13 Javascript
原生js实现鼠标跟随效果
2017/02/28 Javascript
JavaScript实现职责链模式概述
2018/01/25 Javascript
vue实现前台列表数据过滤搜索、分页效果
2019/05/28 Javascript
vue如何使用async、await实现同步请求
2019/12/09 Javascript
Jquery cookie插件实现原理代码解析
2020/08/04 jQuery
element-ui和vue表单(对话框)验证提示语(残留)清除操作
2020/09/11 Javascript
深入浅析python继承问题
2016/05/29 Python
python使用opencv读取图片的实例
2017/08/17 Python
python实现人脸识别经典算法(一) 特征脸法
2018/03/13 Python
基于Django URL传参 FORM表单传数据 get post的用法实例
2018/05/28 Python
Python实现处理逆波兰表达式示例
2018/07/30 Python
python实现飞机大战
2018/09/11 Python
python通过robert、sobel、Laplace算子实现图像边缘提取详解
2019/08/21 Python
python实现的登录与提交表单数据功能示例
2019/09/25 Python
python模块导入的方法
2019/10/24 Python
Python imread、newaxis用法详解
2019/11/04 Python
css3高级选择器使用方法
2013/12/02 HTML / CSS
很酷的小工具和电子产品商城:GearBest
2016/11/19 全球购物
宝拉珍选英国官网:Paula’s Choice英国
2019/05/29 全球购物
俄罗斯连接商品和买家的在线平台:goods.ru
2020/11/30 全球购物
汽车技术服务与营销专业在籍生自荐信
2013/09/28 职场文书
大学生求职简历的自我评价
2013/10/14 职场文书
Golang map映射的用法
2022/04/22 Golang