Python装饰器的执行过程实例分析


Posted in Python onJune 04, 2018

本文实例分析了Python装饰器的执行过程。分享给大家供大家参考,具体如下:

今天看到一句话:装饰器其实就是对闭包的使用,仔细想想,其实就是这回事,今天又看了下闭包,基本上算是弄明白了闭包的执行过程了。其实加上几句话以后就可以很容易的发现,思路给读者,最好自己总结一下,有助于理解。通过代码来说吧。

第一种,装饰器本身不传参数,相对来说过程相对简单的

#!/usr/bin/python
#coding: utf-8
# 装饰器其实就是对闭包的使用
def dec(fun):
  print("call dec")
  def in_dec():
    print("call in_dec")
    fun()
  # 必须加上返回语句,不然的话会默认返回None
  return in_dec
@dec
def fun():
  print("call fun")
# 注意上面的返回语句加上还有不加上的时候这一句执行的区别
print(type(fun))
fun()
'''
通过观察输出结果可以知道函数执行的过程
call dec
<type 'function'>
call in_dec
call fun
观察这几组数据以后,其实很容易发现,先执行装饰器,执行过装饰器以后,代码继续执行最后的print和fun()语句,
但是此时的fun函数其实是指向in_dec的,并不是@下面的fun函数,所以接下来执行的是in_dec,在in_dec中有一个fun()语句,
遇到这个以后才是执行@后面的fun()函数的。
'''

第二种,装饰器本身传参数,个人认为相对复杂,这个过程最好自己总结,有问题大家一块探讨

#!/usr/bin/python
#coding: utf-8
import time, functools
def performance(unit):
  print("call performance")
  def log_decrator(f):
    print("call log_decrator")
    @functools.wraps(f)
    def wrapper(*arg, **kw):
      print("call wrapper")
      t1 = time.time()
      t = f(*arg, **kw)
      t2 = time.time()
      tt = (t2 - t1) * 1000 if unit == "ms" else (t2 - t1)
      print 'call %s() in %f %s' % (f.__name__, tt, unit)
      return t
    return wrapper
  return log_decrator
@performance("ms")
def factorial(n):
  print("call factorial")
  return reduce(lambda x, y: x * y, range(1, 1 + n))
print(type(factorial))
#print(factorial.__name__)
print(factorial(10))
'''接下来的是输出结果,通过结果其实很容易发现执行的过程
call performance
call log_decrator 通过观察前两组的输出结果可以知道,先执行装饰器
<type 'function'>
call wrapper
call factorial
call factorial() in 0.000000 ms
3628800
'''

希望本文所述对大家Python程序设计有所帮助。

Python 相关文章推荐
在Python的Flask框架中构建Web表单的教程
Jun 04 Python
Python实现的网页截图功能【PyQt4与selenium组件】
Jul 12 Python
Python实现的建造者模式示例
Aug 06 Python
Python高级特性切片(Slice)操作详解
Sep 27 Python
python批量下载网站马拉松照片的完整步骤
Dec 05 Python
Python eval的常见错误封装及利用原理详解
Mar 26 Python
Python3.5基础之函数的定义与使用实例详解【参数、作用域、递归、重载等】
Apr 26 Python
Python求离散序列导数的示例
Jul 10 Python
python自定义时钟类、定时任务类
Feb 22 Python
python 实现多线程下载m3u8格式视频并使用fmmpeg合并
Nov 15 Python
如何用Python进行时间序列分解和预测
Mar 01 Python
基于Python编写一个监控CPU的应用系统
Jun 25 Python
使用Python监控文件内容变化代码实例
Jun 04 #Python
Python操作mongodb的9个步骤
Jun 04 #Python
Python中property函数用法实例分析
Jun 04 #Python
使用Python快速搭建HTTP服务和文件共享服务的实例讲解
Jun 04 #Python
python最长回文串算法
Jun 04 #Python
python中字符串的操作方法大全
Jun 03 #Python
Python Logging 日志记录入门学习
Jun 02 #Python
You might like
php分页代码学习示例分享
2014/02/20 PHP
YII模块实现绑定二级域名的方法
2014/07/09 PHP
PHP处理大量表单字段的便捷方法
2015/02/07 PHP
java模拟PHP的pack和unpack类
2016/04/13 PHP
解决PHP程序运行时:Fatal error: Maximum execution time of 30 seconds exceeded in的错误提示
2016/11/25 PHP
PHP实现二维数组按照指定的字段进行排序算法示例
2019/04/23 PHP
PHP+ajax实现上传、删除、修改单张图片及后台处理逻辑操作详解
2020/02/12 PHP
Javascript读取cookie函数代码
2010/10/16 Javascript
关于jQuery新的事件绑定机制on()的使用技巧
2013/04/26 Javascript
JS数组的赋值介绍
2014/03/10 Javascript
js实现可得到不同颜色值的颜色选择器实例
2015/02/28 Javascript
JavaScript数据结构与算法之栈与队列
2016/01/29 Javascript
基于JS模仿windows文件按名称排序效果
2016/06/29 Javascript
bootstrap导航、选项卡实现代码
2016/12/28 Javascript
再谈Angular4 脏值检测(性能优化)
2018/04/23 Javascript
JavaScript JSON数据处理全集(小结)
2019/08/15 Javascript
JavaScript forEach中return失效问题解决方案
2020/06/01 Javascript
vue项目,代码提交至码云,iconfont的用法说明
2020/07/30 Javascript
Python中AND、OR的一个使用小技巧
2015/02/18 Python
Python实现识别手写数字 简易图片存储管理系统
2018/01/29 Python
numpy找出array中的最大值,最小值实例
2018/04/03 Python
详解Python做一个名片管理系统
2019/03/14 Python
一篇文章搞定Python操作文件与目录
2019/08/13 Python
css3实现元素环绕中心点布局的方法示例
2019/01/15 HTML / CSS
Beach Bunny Swimwear官网:设计师泳装和性感比基尼
2019/03/13 全球购物
编写一个 C 函数,该函数在一个字符串中找到可能的最长的子字符串,且该字符串是由同一字符组成的
2015/07/23 面试题
简述安装Slackware Linux系统的过程
2012/01/12 面试题
Java中的类包括什么内容?设计时要注意哪些方面
2012/05/23 面试题
学校学习雷锋活动总结
2014/07/03 职场文书
2014县委书记四风对照检查材料思想汇报
2014/09/21 职场文书
2014年医院党建工作总结
2014/12/20 职场文书
音乐教师个人总结
2015/02/06 职场文书
出国留学自荐信模板
2015/03/06 职场文书
2016年感恩节活动总结大全
2016/04/01 职场文书
SQL实现LeetCode(176.第二高薪水)
2021/08/04 MySQL
PostgreSQL出现死锁该如何解决
2022/05/30 PostgreSQL