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补齐字符串长度的实例
Nov 15 Python
Python操作MySQL数据库的两种方式实例分析【pymysql和pandas】
Mar 18 Python
利用python和百度地图API实现数据地图标注的方法
May 13 Python
Python任意字符串转16, 32, 64进制的方法
Jun 12 Python
Python使用正则表达式分割字符串的实现方法
Jul 16 Python
根据tensor的名字获取变量的值方式
Jan 04 Python
python连接打印机实现打印文档、图片、pdf文件等功能
Feb 07 Python
Python利用逻辑回归分类实现模板
Feb 15 Python
Python如何操作docker redis过程解析
Aug 10 Python
django项目中使用云片网发送短信验证码的实现
Jan 19 Python
Python文件的操作示例的详细讲解
Apr 08 Python
python数据分析之用sklearn预测糖尿病
Apr 22 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 stream_get_meta_data返回值
2013/09/29 PHP
php里array_work用法实例分析
2015/07/13 PHP
Yii框架结合sphinx,Ajax实现搜索分页功能示例
2016/10/18 PHP
php实现微信企业号支付个人的方法详解
2017/07/26 PHP
基于jQuery的星级评分插件
2011/08/12 Javascript
使用javascipt---实现二分查找法
2013/04/10 Javascript
js表单验证实例讲解
2016/03/31 Javascript
AngularJS表单详解及示例代码
2016/08/17 Javascript
js实现图片淡入淡出切换简易效果
2016/08/22 Javascript
jQuery实现点击任意位置弹出层外关闭弹出层效果
2016/10/19 Javascript
微信小程序 省市区选择器实例详解(附源码下载)
2017/01/05 Javascript
vue.js删除动态绑定的radio的指定项
2017/06/02 Javascript
AngularJS select设置默认值的实现方法
2017/08/25 Javascript
vue.js  父向子组件传参的实例代码
2017/10/29 Javascript
bootstrap+jquery项目引入文件报错的解决方法
2018/01/22 jQuery
你点的 ES6一些小技巧,请查收
2018/04/25 Javascript
JS实现可针对算术表达式求值的计算器功能示例
2018/09/04 Javascript
ES6入门教程之Array.from()方法
2019/03/23 Javascript
Flutter实现仿微信底部菜单栏功能
2019/09/18 Javascript
微信内置开发 iOS修改键盘换行为搜索的解决方案
2019/11/06 Javascript
微信小程序之左右布局的实现代码
2019/12/13 Javascript
Nodejs实现微信分账的示例代码
2021/01/19 NodeJs
[01:42]TI4西雅图DOTA2前线报道 第一顿早饭哦
2014/07/08 DOTA
python实现的udp协议Server和Client代码实例
2014/06/04 Python
python中多个装饰器的调用顺序详解
2019/07/16 Python
利用python实现周期财务统计可视化
2019/08/25 Python
python wav模块获取采样率 采样点声道量化位数(实例代码)
2020/01/22 Python
Django实现从数据库中获取到的数据转换为dict
2020/03/27 Python
matplotlib 曲线图 和 折线图 plt.plot()实例
2020/04/17 Python
中邮全球便购:中国邮政速递物流
2017/03/04 全球购物
美国在线眼镜商城:Eyeglasses.com
2017/06/26 全球购物
大学本科生的个人自我评价
2013/12/09 职场文书
护理专业自我鉴定
2014/01/30 职场文书
保护环境建议书300字
2014/05/13 职场文书
无财产离婚协议书范本
2014/10/28 职场文书
成事在人观后感
2015/06/16 职场文书