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中的is和id用法分析
Jan 26 Python
python3.5仿微软计算器程序
Mar 30 Python
Python连接phoenix的方法示例
Sep 29 Python
python实现扫描日志关键字的示例
Apr 28 Python
Python之用户输入的实例
Jun 22 Python
对Python3 goto 语句的使用方法详解
Feb 16 Python
Python实现平行坐标图的两种方法小结
Jul 04 Python
Python 面向对象部分知识点小结
Mar 09 Python
Python任务调度利器之APScheduler详解
Apr 02 Python
jupyter lab的目录调整及设置默认浏览器为chrome的方法
Apr 10 Python
python geopandas读取、创建shapefile文件的方法
Jun 29 Python
Python OpenCV之常用滤波器使用详解
Apr 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
一个简单的自动发送邮件系统(三)
2006/10/09 PHP
php.ini中date.timezone设置分析
2011/07/29 PHP
php实现查询百度google收录情况(示例代码)
2013/08/02 PHP
php微信公众号开发模式详解
2016/11/28 PHP
简述php环境搭建与配置
2016/12/05 PHP
php 人员权限管理(RBAC)实例(推荐)
2017/05/24 PHP
基于php数组中的索引数组和关联数组详解
2018/03/12 PHP
php微信分享到朋友圈、QQ、朋友、微博
2019/02/18 PHP
JQuery中form验证出错信息的查看方法
2013/10/08 Javascript
Angularjs中的页面访问权限怎么设置
2016/11/11 Javascript
Jquery Easyui分割按钮组件SplitButton使用详解(17)
2016/12/18 Javascript
vue打包后显示空白正确处理方法
2017/11/01 Javascript
nodejs log4js 使用详解
2019/05/31 NodeJs
JS实现可用滑块滑动的缓动图代码
2019/09/01 Javascript
Echarts在Taro微信小程序开发中的踩坑记录
2020/11/09 Javascript
python解析xml模块封装代码
2014/02/07 Python
Python设计模式之观察者模式实例
2014/04/26 Python
Python基于分水岭算法解决走迷宫游戏示例
2017/09/26 Python
django1.11.1 models 数据库同步方法
2018/05/30 Python
django2用iframe标签完成网页内嵌播放b站视频功能
2018/06/20 Python
python实现从本地摄像头和网络摄像头截取图片功能
2019/07/11 Python
Python pickle模块常用方法代码实例
2020/10/10 Python
CSS3实现任意图片lowpoly动画效果实例
2017/05/11 HTML / CSS
CSS3制作酷炫的三维相册效果
2016/07/01 HTML / CSS
CSS3 Notes: -webkit-box-reflect实现倒影的实例
2016/12/08 HTML / CSS
经济实惠的豪华家具:My-Furniture
2019/03/12 全球购物
eBay英国购物网站:eBay.co.uk
2019/06/19 全球购物
Douglas意大利官网:购买香水和化妆品
2020/05/27 全球购物
啤酒节策划方案
2014/05/28 职场文书
五水共治一句话承诺
2014/05/30 职场文书
青春飞扬演讲稿
2014/09/11 职场文书
2014学习优秀共产党员先进事迹材料思想汇报
2014/09/14 职场文书
2015年汽车销售工作总结
2015/04/07 职场文书
2016年党员承诺书范文
2016/03/24 职场文书
600字作文之感受大自然
2019/11/27 职场文书
Python中第三方库Faker的使用详解
2022/04/02 Python