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入门篇之文件
Oct 20 Python
几个提升Python运行效率的方法之间的对比
Apr 03 Python
MySQL最常见的操作语句小结
May 07 Python
Python实现处理管道的方法
Jun 04 Python
Python中常用操作字符串的函数与方法总结
Feb 04 Python
基于ID3决策树算法的实现(Python版)
May 31 Python
numpy自动生成数组详解
Dec 15 Python
Django 日志配置按日期滚动的方法
Jan 31 Python
pyqt5移动鼠标显示坐标的方法
Jun 21 Python
django商品分类及商品数据建模实例详解
Jan 03 Python
基于python实现地址和经纬度转换
May 19 Python
浅谈盘点5种基于Python生成的个性化语音方法
Feb 05 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
再次研究下cache_lite
2007/02/14 PHP
php中flush()、ob_flush()、ob_end_flush()的区别介绍
2013/02/17 PHP
php基于自定义函数记录log日志方法
2017/07/21 PHP
PHP程序守护进程化实现方法详解
2020/07/16 PHP
从零开始学习jQuery (三) 管理jQuery包装集
2011/02/23 Javascript
妙用Jquery的val()方法
2012/06/27 Javascript
js监听键盘事件示例代码
2013/07/26 Javascript
浅析jQuery移动开发中内联按钮和分组按钮的编写
2015/12/04 Javascript
jQuery如何获取动态添加的元素
2016/06/24 Javascript
Javascript typeof与instanceof的区别
2016/10/18 Javascript
微信小程序 数据绑定详解及实例
2016/10/25 Javascript
获取select的value、text值的简单示例(jquery与javascript)
2016/12/07 Javascript
微信小程序模板和模块化用法实例分析
2017/11/28 Javascript
js推箱子小游戏步骤代码解析
2018/01/10 Javascript
浅谈Redux中间件的实践
2018/07/27 Javascript
解决bootstrap-select 动态加载数据不显示的问题
2018/08/10 Javascript
使用原生js编写一个简单的框选功能方法
2019/05/13 Javascript
jQuery实现checkbox全选、反选及删除等操作的方法详解
2019/08/02 jQuery
viewer.js实现图片预览功能
2020/06/24 Javascript
JS图片懒加载技术实现过程解析
2020/07/27 Javascript
Python中使用ConfigParser解析ini配置文件实例
2014/08/30 Python
Django的数据模型访问多对多键值的方法
2015/07/21 Python
python搭建微信公众平台
2016/02/09 Python
Tensorflow 合并通道及加载子模型的方法
2018/07/26 Python
浅析python3字符串格式化format()函数的简单用法
2018/12/07 Python
对python3 sort sorted 函数的应用详解
2019/06/27 Python
python Django 创建应用过程图示详解
2019/07/29 Python
关于python3中setup.py小概念解析
2019/08/22 Python
英国领先的家庭时尚品牌:Peacocks
2018/01/11 全球购物
JD Sports芬兰:英国领先的运动鞋和运动服饰零售商
2018/11/16 全球购物
化石印度尼西亚在线商店:Fossil Indonesia
2019/03/11 全球购物
说说在weblogic中开发消息Bean时的persistent与non-persisten的差别
2013/04/07 面试题
考试作弊检讨书1000字(5篇)
2014/10/19 职场文书
拾金不昧表扬信
2015/01/16 职场文书
教师反邪教心得体会
2016/01/15 职场文书
Java实现添加条码或二维码到Word文档
2022/06/01 Java/Android