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中的reduce内建函数使用方法指南
Aug 31 Python
Windows下PyMongo下载及安装教程
Apr 27 Python
Python tkinter事件高级用法实例
Jan 31 Python
解决python3中解压zip文件是文件名乱码的问题
Mar 22 Python
python 读取DICOM头文件的实例
May 07 Python
详解Python3序列赋值、序列解包
May 14 Python
OpenCV 模板匹配
Jul 10 Python
Django使用中间键实现csrf认证详解
Jul 22 Python
Python使用lambda表达式对字典排序操作示例
Jul 25 Python
详解django实现自定义manage命令的扩展
Aug 13 Python
解决pycharm同一目录下无法import其他文件
Feb 12 Python
最小二乘法及其python实现详解
Feb 24 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
虹吸壶是谁发明的?煮出来的咖啡好喝吗
2021/03/04 冲泡冲煮
TP5(thinkPHP框架)实现后台清除缓存功能示例
2019/05/29 PHP
利用js跨页面保存变量做菜单的方法
2008/01/17 Javascript
jquery获取下拉列表的值为null的解决方法
2011/03/18 Javascript
jQuery如何实现点击页面获得当前点击元素的id或其他信息
2014/01/09 Javascript
js弹窗返回值详解(window.open方式)
2014/01/11 Javascript
一个简单的jquery的多选下拉框(自写)
2014/05/05 Javascript
分享一个自己写的简单的javascript分页组件
2015/02/15 Javascript
jQuery判断元素上是否绑定了指定事件的方法
2015/03/17 Javascript
一览画面点击复选框后获取多个id值的方法
2016/05/30 Javascript
Jquery为DIV添加click事件的简单实例
2016/06/02 Javascript
js 获取经纬度的实现方法
2016/06/20 Javascript
如何提高javascript加载速度
2016/12/26 Javascript
浅谈Node模块系统及其模式
2017/11/17 Javascript
bootstrapTable+ajax加载数据 refresh更新数据
2018/08/31 Javascript
如何在JavaScript中优雅的提取循环内数据详解
2019/03/04 Javascript
Vue-cli3简单使用(图文步骤)
2019/04/30 Javascript
Vue-cli3.X使用px2 rem遇到的问题及解决方法
2019/08/08 Javascript
解决node终端下运行js文件不支持ES6语法
2020/04/04 Javascript
javascript设计模式 ? 原型模式原理与应用实例分析
2020/04/10 Javascript
详解JavaScript中的Object.is()与&quot;===&quot;运算符总结
2020/06/17 Javascript
[12:21]VICI vs TNC (BO3)
2018/06/07 DOTA
[42:50]NB vs VP 2018国际邀请赛小组赛BO2 第二场 8.18
2018/08/19 DOTA
python 使用pandas计算累积求和的方法
2019/02/08 Python
Python3的高阶函数map,reduce,filter的示例详解
2019/07/23 Python
django自带调试服务器的使用详解
2019/08/29 Python
Python 使用双重循环打印图形菱形操作
2020/08/09 Python
matplotlib基础绘图命令之bar的使用方法
2020/08/13 Python
Python tkinter之ComboBox(下拉框)的使用简介
2021/02/05 Python
Kathmandu英国网站:新西兰户外运动品牌
2017/03/27 全球购物
社区消防工作实施方案
2014/03/21 职场文书
房屋所有权证明
2014/10/20 职场文书
辞职信怎么写
2015/02/27 职场文书
2016学校先进集体事迹材料
2016/02/29 职场文书
检讨书之工作不认真
2019/08/14 职场文书
JavaScript中关于预编译、作用域链和闭包的理解
2021/03/31 Javascript