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 ljust rjust center输出
Sep 06 Python
Python中使用装饰器和元编程实现结构体类实例
Jan 28 Python
用Python的Flask框架结合MySQL写一个内存监控程序
Nov 07 Python
pygame加载中文名mp3文件出现error
Mar 31 Python
python基本语法练习实例
Sep 19 Python
使用apidocJs快速生成在线文档的实例讲解
Feb 07 Python
python3转换code128条形码的方法
Apr 17 Python
pyinstaller打包多个py文件和去除cmd黑框的方法
Jun 21 Python
tensorflow 报错unitialized value的解决方法
Feb 06 Python
Python调用Windows命令打印文件
Feb 07 Python
python判断一个变量是否已经设置的方法
Aug 13 Python
Python趣味挑战之用pygame实现简单的金币旋转效果
May 31 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
支持oicq头像的留言簿(二)
2006/10/09 PHP
有关PHP中MVC的开发经验分享
2012/05/17 PHP
PHP仿微信多图片预览上传实例代码
2016/09/13 PHP
浅析php-fpm静态和动态执行方式的比较
2016/11/09 PHP
Laravel 集成微信用户登录和绑定的实现
2019/12/27 PHP
js 无提示关闭浏览器页面的代码
2010/03/09 Javascript
javascript中的prototype属性实例分析说明
2010/08/09 Javascript
网页前端优化之滚动延时加载图片示例
2013/07/13 Javascript
固定网页背景图同时保持图片比例的思路代码
2013/08/15 Javascript
解决jquery1.9不支持browser对象的问题
2013/11/13 Javascript
从零学JS之你需要了解的几本书
2014/05/19 Javascript
jQuery实现3D文字特效的方法
2015/03/10 Javascript
基于JavaScript实现瀑布流布局(二)
2016/01/26 Javascript
EasyUi中的Combogrid 实现分页和动态搜索远程数据
2016/04/01 Javascript
基于chosen插件实现人员选择树搜索自动筛选功能
2016/09/24 Javascript
AngularJS实现动态编译添加到dom中的方法
2016/11/04 Javascript
使用 Javascript 实现浏览器推送提醒功能的示例
2017/11/03 Javascript
JS实现的集合去重,交集,并集,差集功能示例
2018/03/13 Javascript
微信小程序 MinUI组件库系列之badge徽章组件示例
2018/08/20 Javascript
解决vue使用vant下拉框van-dropdown-item 绑定title值不变问题
2020/08/05 Javascript
Openlayers实现距离面积测量
2020/09/28 Javascript
Python使用Redis实现作业调度系统(超简单)
2016/03/22 Python
Python XlsxWriter模块Chart类用法实例分析
2019/03/11 Python
Python基于BeautifulSoup和requests实现的爬虫功能示例
2019/08/02 Python
如何基于python操作excel并获取内容
2019/12/24 Python
为什么python比较流行
2020/06/19 Python
python实现AHP算法的方法实例(层次分析法)
2020/09/09 Python
jupyter notebook远程访问不了的问题解决方法
2021/01/11 Python
使用tkinter实现三子棋游戏
2021/02/25 Python
SmartBuyGlasses意大利:购买太阳镜、眼镜和隐形眼镜
2018/11/20 全球购物
给校长的建议书100字
2014/05/16 职场文书
工资收入证明
2014/10/07 职场文书
国庆节标语大全
2014/10/08 职场文书
2014年学校党建工作汇报材料
2014/11/02 职场文书
大学生军训感言
2015/08/01 职场文书
军训心得体会范文(2016最新篇)
2016/01/11 职场文书