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 相关文章推荐
django使用html模板减少代码代码解析
Dec 12 Python
python 自定义异常和异常捕捉的方法
Oct 18 Python
使用python 打开文件并做匹配处理的实例
Jan 02 Python
spark dataframe 将一列展开,把该列所有值都变成新列的方法
Jan 29 Python
python使用pipeline批量读写redis的方法
Feb 18 Python
pytorch 在网络中添加可训练参数,修改预训练权重文件的方法
Aug 17 Python
python监控nginx端口和进程状态
Sep 06 Python
Python爬虫使用代理IP的实现
Oct 27 Python
Python数据可视化:饼状图的实例讲解
Dec 07 Python
Python模块的定义,模块的导入,__name__用法实例分析
Jan 07 Python
Python pip install之SSL异常处理操作
Sep 03 Python
详解python的变量缓存机制
Jan 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
PHP+MySQL存储数据常见中文乱码问题小结
2016/06/13 PHP
PHP中的密码加密的解决方案总结
2016/10/26 PHP
laravel框架分组控制器和分组路由实现方法示例
2020/01/25 PHP
javascript forEach通用循环遍历方法
2010/10/11 Javascript
一款基jquery超炫的动画导航菜单可响应单击事件
2014/11/02 Javascript
跟我学习javascript的全局变量
2015/11/16 Javascript
JavaScript实现广告弹窗效果
2016/08/09 Javascript
vue.js指令v-for使用及索引获取
2016/11/03 Javascript
浅谈vue-cli 3.0.x 初体验
2018/04/11 Javascript
基于vue实现可搜索下拉框定制组件
2020/03/26 Javascript
详解vue-property-decorator使用手册
2019/07/29 Javascript
countUp.js实现数字滚动效果
2019/10/18 Javascript
vue实现pdf文档在线预览功能
2019/11/26 Javascript
[28:48]《真视界》- 2017年国际邀请赛
2017/09/27 DOTA
[01:06:12]VP vs NIP 2019国际邀请赛小组赛 BO2 第一场 8.15
2019/08/17 DOTA
Python自动调用IE打开某个网站的方法
2015/06/03 Python
Python内建数据结构详解
2016/02/03 Python
Python使用smtplib模块发送电子邮件的流程详解
2016/06/27 Python
解决安装python库时windows error5 报错的问题
2018/10/21 Python
手写一个python迭代器过程详解
2019/08/27 Python
Python文本处理简单易懂方法解析
2019/12/19 Python
tensorflow中tf.slice和tf.gather切片函数的使用
2020/01/19 Python
PyCharm刷新项目(文件)目录的实现
2020/02/14 Python
python计算导数并绘图的实例
2020/02/29 Python
Python GUI编程学习笔记之tkinter控件的介绍及基本使用方法详解
2020/03/30 Python
Python测试框架:pytest学习笔记
2020/10/20 Python
利于python脚本编写可视化nmap和masscan的方法
2020/12/29 Python
HTML5的语法变化介绍
2013/08/13 HTML / CSS
基本款天堂:Everlane
2017/05/13 全球购物
美国在线医疗分销商:MedEx Supply
2020/02/04 全球购物
简述数据库的设计过程
2015/06/22 面试题
党政领导班子群众路线对照检查材料
2014/10/26 职场文书
小学生优秀评语
2014/12/29 职场文书
看上去很美观后感
2015/06/10 职场文书
活动简报范文
2015/07/22 职场文书
Mysql 如何实现多张无关联表查询数据并分页
2021/06/05 MySQL