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采用requests库模拟登录和抓取数据的简单示例
Jul 05 Python
python使用PythonMagick将jpg图片转换成ico图片的方法
Mar 26 Python
Django Admin实现上传图片校验功能
Mar 06 Python
python3.x上post发送json数据
Mar 04 Python
一看就懂得Python的math模块
Oct 21 Python
pandas计数 value_counts()的使用
Jun 24 Python
Python实现微信小程序支付功能
Jul 25 Python
python selenium实现发送带附件的邮件代码实例
Dec 10 Python
python2.7使用scapy发送syn实例
May 05 Python
将pycharm配置为matlab或者spyder的用法说明
Jun 08 Python
python3获取控制台输入的数据的具体实例
Aug 16 Python
python collections模块的使用
Oct 16 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
Linux下实现PHP多进程的方法分享
2012/08/16 PHP
Zend的MVC机制使用分析(二)
2013/05/02 PHP
PHP中使用GD库创建圆形饼图的例子
2014/11/19 PHP
php结合ajax实现手机发红包的案例
2016/10/13 PHP
PHP安装memcache扩展的步骤讲解
2019/02/14 PHP
TopList标签和JavaScript结合两例
2007/08/12 Javascript
js判断变量是否空值的代码
2008/10/26 Javascript
javascript学习笔记(一) 在html中使用javascript
2012/06/18 Javascript
javascript 中String.match()与RegExp.exec()的区别说明
2013/01/10 Javascript
jquery如何把参数列严格转换成数组实现思路
2013/04/01 Javascript
使用JavaScript修改浏览器URL地址栏的实现代码
2013/10/21 Javascript
jQuery实现渐变下拉菜单的简单方法
2015/03/11 Javascript
js弹出对话框方式小结
2015/11/17 Javascript
javascript实现抽奖程序的简单实例
2016/06/07 Javascript
require.js配合插件text.js实现最简单的单页应用程序
2016/07/12 Javascript
利用jsonp跨域调用百度js实现搜索框智能提示
2016/08/24 Javascript
JS定时器实现数值从0到10来回变化
2016/12/09 Javascript
jQuery插件jquery.kxbdmarquee.js实现无缝滚动效果
2017/02/15 Javascript
微信小程序 获取javascript 里的数据
2017/08/17 Javascript
angular项目中bootstrap-datetimepicker时间插件的使用示例
2018/03/15 Javascript
jquery.pagination.js分页使用教程
2018/10/23 jQuery
vue多页面项目中路由使用history模式的方法
2019/09/23 Javascript
vue 更改连接后台的api示例
2019/11/11 Javascript
JavaScript Array.flat()函数用法解析
2020/09/02 Javascript
python基础教程之缩进介绍
2014/08/29 Python
在Python中操作字典之setdefault()方法的使用
2015/05/21 Python
Python创建对称矩阵的方法示例【基于numpy模块】
2017/10/12 Python
微信跳一跳python代码实现
2018/01/05 Python
python中从str中提取元素到list以及将list转换为str的方法
2018/06/26 Python
python 中文件输入输出及os模块对文件系统的操作方法
2018/08/27 Python
在python中使用with打开多个文件的方法
2019/01/07 Python
Python matplotlib生成图片背景透明的示例代码
2019/08/30 Python
Python创建简单的神经网络实例讲解
2021/01/04 Python
大学四年的个人自我评价
2014/01/14 职场文书
小区保洁员岗位职责
2015/04/10 职场文书
人民调解协议书
2016/03/21 职场文书