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判断IP地址合法性的方法实例
Mar 13 Python
Python实现Windows和Linux之间互相传输文件(文件夹)的方法
May 08 Python
Php多进程实现代码
May 07 Python
关于Pycharm无法debug问题的总结
Jan 19 Python
djang常用查询SQL语句的使用代码
Feb 15 Python
Django异步任务线程池实现原理
Dec 17 Python
Python 爬虫性能相关总结
Aug 03 Python
Python常用断言函数实例汇总
Nov 30 Python
Pycharm-community-2020.2.3 社区版安装教程图文详解
Dec 08 Python
python实现Thrift服务端的方法
Apr 20 Python
Matlab如何实现矩阵复制扩充
Jun 02 Python
Python 数据科学 Matplotlib图库详解
Jul 07 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下过滤HTML代码的函数
2007/12/10 PHP
header跳转和include包含问题详解
2012/09/08 PHP
浅谈web上存漏洞及原理分析、防范方法(安全文件上存方法)
2013/06/29 PHP
php curl模拟post提交数据示例
2013/12/31 PHP
PHP读取大文件的类SplFileObject使用介绍
2014/04/09 PHP
Laravel 4 初级教程之Pages、表单验证
2014/10/30 PHP
PHP实现的oracle分页函数实例
2016/01/25 PHP
Zend Framework自定义Helper类相关注意事项总结
2016/03/14 PHP
laravel5 Eloquent 实现事务方式
2019/10/21 PHP
javascript options属性集合操作代码
2009/12/28 Javascript
JavaScript QueryString解析类代码
2010/01/17 Javascript
JavaScript中的View-Model使用介绍
2011/08/11 Javascript
jquery退出each循环的写法
2014/02/26 Javascript
jQuery的几个我们必须了解的特点
2015/05/03 Javascript
JS实现的在线调色板实例(附demo源码下载)
2016/03/01 Javascript
浅谈js构造函数的方法与原型prototype
2016/07/04 Javascript
jQuery基于ajax操作json数据简单示例
2017/01/05 Javascript
js 颜色选择插件
2017/01/23 Javascript
微信小程序分页加载的实例代码
2017/07/11 Javascript
JS实现弹出下载对话框及常见文件类型的下载
2017/07/13 Javascript
用JavaScript做简易的购物车的代码示例
2017/10/20 Javascript
Angular 开发学习之Angular CLI的安装使用
2017/12/31 Javascript
JQuery复选框全选效果如何实现
2020/05/08 jQuery
Python实现115网盘自动下载的方法
2014/09/30 Python
python实现定时同步本机与北京时间的方法
2015/03/24 Python
Python实现二叉堆
2016/02/03 Python
Python入门教程之运算符与控制流
2016/08/17 Python
Python实现读取并保存文件的类
2017/05/11 Python
python根据完整路径获得盘名/路径名/文件名/文件扩展名的方法
2020/04/22 Python
简单介绍CSS3中Media Query的使用
2015/07/07 HTML / CSS
领导的自我鉴定
2013/12/28 职场文书
三字经教学反思
2014/04/26 职场文书
领导班子党的群众路线教育实践活动对照检查材料
2014/09/25 职场文书
出差报告格式模板
2014/11/06 职场文书
ThinkPHP5和ThinkPHP6的区别
2021/03/31 PHP
mysql使用instr达到in(字符串)的效果
2022/04/03 MySQL