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 相关文章推荐
使用pdb模块调试Python程序实例
Jun 02 Python
Python实现将文本生成二维码的方法示例
Jul 18 Python
python tornado微信开发入门代码
Aug 24 Python
OpenCV搞定腾讯滑块验证码的实现代码
May 18 Python
django admin 自定义替换change页面模板的方法
Aug 23 Python
python随机生成库faker库api实例详解
Nov 28 Python
python爬虫爬取监控教务系统的思路详解
Jan 08 Python
django 实现手动存储文件到model的FileField
Mar 30 Python
python爬虫使用scrapy注意事项
Nov 23 Python
python中添加模块导入路径的方法
Feb 03 Python
pytorch加载预训练模型与自己模型不匹配的解决方案
May 13 Python
分位数回归模型quantile regeression应用详解及示例教程
Nov 02 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之autoload运行机制实例分析
2014/08/28 PHP
php多个文件及图片上传实例详解
2014/11/10 PHP
PHP ElasticSearch做搜索实例讲解
2020/02/05 PHP
js 强制弹出窗口代码研究-又一款代码
2010/03/20 Javascript
javascript在myeclipse中报错的解决方法
2013/10/29 Javascript
javascript学习笔记--数字格式类型
2014/05/22 Javascript
jQuery中的ajax async同步和异步详解
2015/09/29 Javascript
javascript函数自动执行常用方法汇总
2016/03/28 Javascript
Jquery获取当前城市的天气信息
2016/08/05 Javascript
总结十个Angular.js由浅入深的面试问题
2016/08/26 Javascript
Javascript数组中push方法用法分析
2016/10/31 Javascript
jQuery使用Layer弹出层插件闪退问题
2016/12/22 Javascript
微信小程序 参数传递实例代码
2017/03/20 Javascript
Node.js安装配置图文教程
2017/05/10 Javascript
ReactNative踩坑之配置调试端口的解决方法
2017/07/28 Javascript
vue使用axios时关于this的指向问题详解
2017/12/22 Javascript
基于layui框架响应式布局的一些使用详解
2019/09/16 Javascript
node解析修改nginx配置文件操作实例分析
2019/11/06 Javascript
深入理解webpack process.env.NODE_ENV配置
2020/02/23 Javascript
python模拟新浪微博登陆功能(新浪微博爬虫)
2013/12/24 Python
Python实现计算两个时间之间相差天数的方法
2017/05/10 Python
python yield关键词案例测试
2019/10/15 Python
Python Pillow.Image 图像保存和参数选择方式
2020/01/09 Python
怎么快速自学python
2020/06/22 Python
Styleonme中文网:韩国高档人气品牌
2017/06/21 全球购物
美国女性奢华品牌精品店:INTERMIX
2017/10/12 全球购物
英国国家美术馆商店:National Gallery
2019/05/01 全球购物
电子商务专业毕业生工作推荐信
2013/11/17 职场文书
导游实习生自荐书
2014/01/28 职场文书
中秋晚会策划方案
2014/06/12 职场文书
班组长安全工作职责
2014/07/15 职场文书
房地产工程部经理岗位职责
2015/04/09 职场文书
2016先进集体事迹材料范文
2016/02/25 职场文书
导游词之丽江普济寺
2019/10/22 职场文书
一文弄懂MySQL索引创建原则
2022/02/28 MySQL
yolov5返回坐标的方法实例
2022/03/17 Python