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循环监控远程端口的方法
Mar 14 Python
Python函数式编程指南(三):迭代器详解
Jun 24 Python
python+pygame简单画板实现代码实例
Dec 13 Python
python实现下载pop3邮件保存到本地
Jun 19 Python
python 去除二维数组/二维列表中的重复行方法
Jan 23 Python
在python tkinter中Canvas实现进度条显示的方法
Jun 14 Python
python+tkinter实现学生管理系统
Aug 20 Python
Python生成验证码、计算具体日期是一年中的第几天实例代码详解
Oct 16 Python
Python大数据之使用lxml库解析html网页文件示例
Nov 16 Python
python matplotlib 画dataframe的时间序列图实例
Nov 20 Python
Pycharm plot独立窗口显示的操作
Dec 11 Python
Python使用PyYAML库读写yaml文件的方法
Apr 06 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
PHP5+UTF8多文件上传类
2008/10/17 PHP
php 目录与文件处理-郑阿奇(续)
2011/07/04 PHP
PHP以及MYSQL日期比较方法
2012/11/29 PHP
一个php短网址的生成代码(仿微博短网址)
2014/05/07 PHP
PHP模拟http请求的方法详解
2016/11/09 PHP
PHP实现在windows下配置sendmail并通过mail()函数发送邮件的方法
2017/06/20 PHP
javascript 中对象的继承〔转贴〕
2007/01/22 Javascript
基于jquery的页面划词搜索JS
2010/09/14 Javascript
JS时间选择器 兼容IE6,7,8,9
2012/06/26 Javascript
js计算精度问题小结
2013/04/22 Javascript
JavaScript实现页面实时显示当前时间的简单实例
2013/07/20 Javascript
JS将数字转换成三位逗号分隔的样式(示例代码)
2014/02/19 Javascript
IE8下Jquery获取select选中的值post到后台报错问题
2014/07/02 Javascript
jquery插件corner实现圆角边框的方法
2015/03/09 Javascript
javasript实现密码的隐藏与显示
2015/05/08 Javascript
JS实现新浪微博效果带遮罩层的弹出框代码
2015/10/12 Javascript
ES6中非常实用的新特性介绍
2016/03/10 Javascript
浅谈js算法和流程控制
2016/12/29 Javascript
jQuery插件HighCharts实现的2D面积图效果示例【附demo源码下载】
2017/03/15 Javascript
js学习总结之DOM2兼容处理重复问题的解决方法
2017/07/27 Javascript
Vue入门之数量加减运算操作示例
2018/12/11 Javascript
微信h5静默和非静默授权获取用户openId的方法和步骤
2020/06/08 Javascript
详解Node.JS模块 process
2020/08/31 Javascript
Ant Design Vue table中列超长显示...并加提示语的实例
2020/10/31 Javascript
Python调用命令行进度条的方法
2015/05/05 Python
python 将md5转为16字节的方法
2018/05/29 Python
opencv与numpy的图像基本操作
2019/03/08 Python
详解python变量与数据类型
2020/08/25 Python
美国老牌主机服务商:iPage
2016/07/22 全球购物
澳大利亚网上买书:Angus & Robertson
2019/07/21 全球购物
欧洲最古老的鞋厂:Peter Kaiser
2019/11/05 全球购物
怎样写演讲稿
2014/01/04 职场文书
公司总经理工作职责管理办法
2014/02/28 职场文书
工作证明范本(2篇)
2014/09/14 职场文书
校园环境卫生倡议书
2015/04/29 职场文书
幼儿园推普周活动总结
2015/05/07 职场文书