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的Django框架中的Cookie相关处理
Jul 22 Python
pandas使用apply多列生成一列数据的实例
Nov 28 Python
Python 隐藏输入密码时屏幕回显的实例
Feb 19 Python
python隐藏终端执行cmd命令的方法
Jun 24 Python
django序列化serializers过程解析
Dec 14 Python
django ajax发送post请求的两种方法
Jan 05 Python
Python中的X[:,0]、X[:,1]、X[:,:,0]、X[:,:,1]、X[:,m:n]和X[:,:,m:n]
Feb 13 Python
Python通过两个dataframe用for循环求笛卡尔积
Apr 29 Python
如何使用PyCharm引入需要使用的包的方法
Sep 22 Python
详解python 条件语句和while循环的实例代码
Dec 28 Python
Python 将代码转换为可执行文件脱离python环境运行(步骤详解)
Jan 25 Python
Python+Selenium自动化环境搭建与操作基础详解
Mar 13 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
用 php 编写的日历
2006/10/09 PHP
配置PHP使之能同时支持GIF和JPEG
2006/10/09 PHP
PHP程序61条面向对象分析设计的经验小结
2008/11/12 PHP
PHP函数之error_reporting(E_ALL ^ E_NOTICE)详细说明
2011/07/01 PHP
PHP输出日历表代码实例
2015/03/27 PHP
php+ajax实现无刷新文件上传功能(ajaxuploadfile)
2018/02/11 PHP
浅析PHP7 的垃圾回收机制
2019/09/06 PHP
javascript firefox兼容ie的dom方法脚本
2008/05/18 Javascript
jsPDF导出pdf示例
2014/05/02 Javascript
js函数调用的方式
2014/05/06 Javascript
基于jQuery实现下拉框
2014/11/24 Javascript
jquery使用each方法遍历json格式数据实例
2015/05/18 Javascript
如何使用jquery easyui创建标签组件
2015/11/18 Javascript
浅析BootStrap模态框的使用(经典)
2016/04/29 Javascript
Bootstrap Table服务器分页与在线编辑应用总结
2016/08/08 Javascript
深入浅析JS Function()构造函数
2016/08/22 Javascript
jQuery图片查看插件Magnify开发详解
2017/12/25 jQuery
VScode格式化ESlint方法(最全最好用方法)
2019/09/10 Javascript
Python中List.index()方法的使用教程
2015/05/20 Python
深入理解Python3中的http.client模块
2017/03/29 Python
利用python如何处理nc数据详解
2018/05/23 Python
python3.5绘制随机漫步图
2018/08/27 Python
Python中面向对象你应该知道的一下知识
2019/07/10 Python
Python多叉树的构造及取出节点数据(treelib)的方法
2019/08/09 Python
利用python实现.dcm格式图像转为.jpg格式
2020/01/13 Python
Python转换itertools.chain对象为数组的方法
2020/02/07 Python
Python第三方库的几种安装方式(小结)
2020/04/03 Python
PHP基于phpqrcode类库生成二维码过程解析
2020/05/28 Python
印度领先的在线时尚商店:Koovs
2016/08/28 全球购物
请问软件开发中的设计模式你会使用哪些
2015/05/13 面试题
集体婚礼策划方案
2014/02/22 职场文书
2014年教师党员自我评议
2014/09/19 职场文书
办公室主任岗位职责
2015/01/31 职场文书
尼克胡哲观后感
2015/06/08 职场文书
2016保送生自荐信范文
2016/01/29 职场文书
VUE使用draggable实现组件拖拽
2022/04/06 Vue.js