2019独角兽企业重金招聘Python工程师标准>>>

1、单个装饰器执行

上来先看代码:

import timedef deco(func):@functools.wraps(func)def _wrapper():startTime = time.time()print "start"func()print "end"endTime = time.time()msecs = (endTime - startTime)*1000print("time is %d ms" %msecs)return _wrapper@deco
def func():print("hello")time.sleep(1)print("world")if __name__ == '__main__':print "main start"f = func print "mid"f()print "main end"

再看执行结果:

由此我们可以看出,装饰器执行顺序为主线程——》装饰器,装饰器中调用了被装饰函数的话就在装饰器中依次执行

2、多个装饰器执行

被装饰函数被多个装饰器装饰时,代码如下:

import timedef deco1(func):@functools.wraps(func)def _wrapper():startTime = time.time()print "start1"func()print "end1"endTime = time.time()msecs = (endTime - startTime)*1000print("time1 is %d ms" %msecs)return _wrapperdef deco(func):@functools.wraps(func)def _wrapper():startTime = time.time()print "start"func()print "end"endTime = time.time()msecs = (endTime - startTime)*1000print("time is %d ms" %msecs)return _wrapper@deco
@deco1
def func():print("hello")time.sleep(1)print("world")if __name__ == '__main__':print "main start"f = funcprint "mid"f()print "main end"

运行结果如下:

可以看到,先执行了deco,再执行deco1,然后deco1执行完返回结果作为参数传入deco继续执行。

这就可以回到装饰器的原理来看:

装饰器是在编译时就执行,而不是调用时;装饰器只对函数进行装饰,不对装饰器进行装饰,谁贴函数进谁先执行。

多个装饰器执行的例子,就相当于func = deco1(func), func = deco(func), func() 这也等同于func = deco(deco1(func)), func()。

例如:

import timedef deco1(func):@functools.wraps(func)def _wrapper():startTime = time.time()print "start1"func()print "end1"endTime = time.time()msecs = (endTime - startTime)*1000print("time1 is %d ms" %msecs)return _wrapperdef deco(func):@functools.wraps(func)def _wrapper():startTime = time.time()print "start"func()print "end"endTime = time.time()msecs = (endTime - startTime)*1000print("time is %d ms" %msecs)return _wrapper# @deco
# @deco1
def func():print("hello")time.sleep(1)print("world")if __name__ == '__main__':print "main start"func = deco(deco1(func)) #编译func() #执行print "mid"print "main end"

执行结果和使用deco,deco1装饰器相同。

转载于:https://my.oschina.net/u/3636678/blog/2208910

python装饰器执行顺序相关推荐

  1. Python装饰器执行顺序详解

    探究多个装饰器执行顺序 装饰器是Python用于封装函数或代码的工具,网上可以搜到很多文章可以学习,我在这里要讨论的是多个装饰器执行顺序的一个迷思. 疑问 大部分涉及多个装饰器装饰的函数调用顺序时都会 ...

  2. python装饰器执行顺序_python unittest单元测试框架-3用例执行顺序、多级目录、装饰器、fixtures...

    1.用例执行顺序 unittest默认会按照ascii码的顺序,依次执行.类名--方法名排序,使用discover也是默认排序.如果不想使用默认排序,就使用testsuite测试集的方式. impor ...

  3. python多个装饰器执行顺序_Python面试题之多个装饰器执行顺序

    疑问 大部分涉及多个装饰器装饰的函数调用顺序时都会说明它们是自上而下的,比如下面这个例子:def decorator_a(func): print 'Get in decorator_a' def i ...

  4. Python 的装饰器执行顺序问题(二)

    2019独角兽企业重金招聘Python工程师标准>>> 一.问题分析 具体问题可见:Python 的装饰器执行顺序问题 原代码如下: def testwra(func):print ...

  5. python装饰器调用顺序_聊一聊Python装饰器的代码执行顺序

    为什么写这篇文章? 起因是QQ群里边有人提了一个问题:之前导入模块只需要1~2秒,为什么现在变成需要2~3分钟? 我的第一感觉是:是不是导入的模块顶层代码里边,做了什么耗时的事情.隔了一天,他的问题解 ...

  6. python两个装饰器执行顺序_python中多个装饰器的执行顺序

    今天讲一下python中装饰器的执行顺序,以两个装饰器为例. 装饰器代码如下: def wrapper_out1(func): print('--out11--') def inner1(*args, ...

  7. python两个装饰器执行顺序_python中多个装饰器的执行顺序详解

    装饰器是程序开发中经常会用到的一个功能,也是python语言开发的基础知识,如果能够在程序中合理的使用装饰器,不仅可以提高开发效率,而且可以让写的代码看上去显的高大上^_^ 使用场景 可以用到装饰器的 ...

  8. python装饰器的顺序_python中多个装饰器的执行顺序详解

    装饰器是程序开发中经常会用到的一个功能,也是python语言开发的基础知识,如果能够在程序中合理的使用装饰器,不仅可以提高开发效率,而且可以让写的代码看上去显的高大上^_^ 使用场景 可以用到装饰器的 ...

  9. python装饰器的顺序_python中装饰器的装饰顺序和执行顺序

    在python语言中"装饰器"模式被设计成语言内置的设计模式,使得使用该模式变得简单,仅仅需要在目标函数前使用'@'符号加装饰器名就能达到目的.但如果同一个目标函数需要进行多次装饰 ...

最新文章

  1. 提高C++性能的编程技术笔记:内联+测试代码
  2. android跳转应用市场搜索,Android 应用中跳转到应用市场评分
  3. Linux下FTP服务器搭建
  4. att48数据集最优值10628的解
  5. html5和响应式,35个响应式HTML5和CSS3模版
  6. ADO.NET的数据库查询2009-12-07 02:20 P.M.ADO.NET的数据库查询
  7. spring事务管理一:关于事务管理的接口
  8. 前端跨域问题解决方案汇总
  9. 高级PHP工程师所应该具备的专业素养
  10. Python 卸载python
  11. 关于jq easyui 刷新tabs的问题
  12. 使用复制存储过程执行解决“事务复制中的表大量更新导致无法及时同步”的问题 (转)...
  13. linux下启动某个进程
  14. 贾跃亭发布最新PPT:FF商业计划书
  15. 怎么在电脑上录制qq音乐
  16. 条件格式实现ABC分析
  17. 【第一组】第三次冲刺例会
  18. 不借助其他任何软件防止QQ被盗的小技巧
  19. EasyExcel自定义表头
  20. java计算两个月份差_Java编程实现计算两个日期的月份差实例代码

热门文章

  1. http、https、密码学基础、GET和POST区别
  2. c++编写托管dll_教程:如何编写简单的网站并免费托管
  3. netflix 工作原理_Netflix如何在屏幕后面工作?
  4. 智能家居数据库设计_设计更智能的数据表
  5. java 实现支持向量机
  6. php表单提交完返回,表单内容不清空解决方法
  7. 【Python】安装配置Anaconda
  8. 08.LoT.UI 前后台通用框架分解系列之——多样的Tag选择器
  9. mykernel编译过程中问题解决
  10. iOS中 Animation 动画大全 韩俊强的博客