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 open()文件处理使用介绍
Nov 30 Python
在Python中操作字典之clear()方法的使用
May 21 Python
python简单实现旋转图片的方法
May 30 Python
python中set常用操作汇总
Jun 30 Python
浅析python中SQLAlchemy排序的一个坑
Feb 24 Python
python字符串和常用数据结构知识总结
May 21 Python
Python中的几种矩阵乘法(小结)
Jul 10 Python
Python使用random模块生成随机数操作实例详解
Sep 17 Python
Python内置方法实现字符串的秘钥加解密(推荐)
Dec 09 Python
Pytorch的mean和std调查实例
Jan 02 Python
python文件读取失败怎么处理
Jun 23 Python
Python自动化之UnitTest框架实战记录
Sep 08 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数组生成html下拉列表的方法
2015/07/20 PHP
在Laravel中使用DataTables插件的方法
2018/05/29 PHP
php在linux环境中如何使用redis详解
2020/12/15 PHP
JavaScript+canvas实现七色板效果实例
2016/02/18 Javascript
jQuery简单实现MD5加密的方法
2017/03/03 Javascript
webpack+vue-cli项目中引入外部非模块格式js的方法
2018/09/28 Javascript
JavaScript模板引擎应用场景及实现原理详解
2018/12/14 Javascript
浅谈Angular7 项目开发总结
2018/12/19 Javascript
TypeScript开发Node.js程序的方法
2019/04/30 Javascript
Vue axios与Go Frame后端框架的Options请求跨域问题详解
2020/03/03 Javascript
详解vue-flickity的fullScreen功能实现
2020/04/07 Javascript
[39:52]2018DOTA2亚洲邀请赛 4.3 突围赛 EG vs Newbee 第一场
2018/04/04 DOTA
[26:50]2018完美盛典DOTA2表演赛
2018/12/17 DOTA
python从ftp下载数据保存实例
2013/11/20 Python
Python实现压缩与解压gzip大文件的方法
2016/09/18 Python
Anaconda多环境多版本python配置操作方法
2017/09/12 Python
pandas 快速处理 date_time 日期格式方法
2018/11/12 Python
pycharm创建一个python包方法图解
2019/04/10 Python
Python PIL读取的图像发生自动旋转的实现方法
2019/07/05 Python
Django之编辑时根据条件跳转回原页面的方法
2019/08/21 Python
python实现替换word中的关键文字(使用通配符)
2020/02/13 Python
Python3+selenium实现cookie免密登录的示例代码
2020/03/18 Python
Pycharm 跳转回之前所在页面的操作
2021/02/05 Python
来自全球大都市的高级街头服饰:Pegador
2018/01/03 全球购物
超级英雄、电影和电视、乐队和音乐T恤:Loud Clothing
2019/09/01 全球购物
中文专业毕业生自荐信
2013/10/28 职场文书
兰兰过桥教学反思
2014/02/08 职场文书
2014年国庆标语
2014/06/30 职场文书
大学生学习计划书
2014/09/15 职场文书
感谢信模板大全
2015/01/23 职场文书
杜甫草堂导游词
2015/02/03 职场文书
卫生院艾滋病宣传活动总结
2015/05/09 职场文书
小学六年级毕业感言
2015/07/30 职场文书
学术会议开幕词
2016/03/03 职场文书
2019送给家人们的中秋节祝福语
2019/08/15 职场文书
Spring this调用当前类方法无法拦截的示例代码
2022/03/20 Java/Android