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 相关文章推荐
Python3读取zip文件信息的方法
May 22 Python
Django Highcharts制作图表
Aug 27 Python
详解python调度框架APScheduler使用
Mar 28 Python
Python实现的爬虫功能代码
Jun 24 Python
python+selenium开发环境搭建图文教程
Aug 11 Python
Python全局变量与局部变量区别及用法分析
Sep 03 Python
如何利用Anaconda配置简单的Python环境
Jun 24 Python
python适合人工智能的理由和优势
Jun 28 Python
详解Python并发编程之创建多线程的几种方法
Aug 23 Python
python实现高斯投影正反算方式
Jan 17 Python
基于Python3读写INI配置文件过程解析
Jul 23 Python
python爬取”顶点小说网“《纯阳剑尊》的示例代码
Oct 16 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源码分析之DZX1.5随机数函数random用法
2015/06/17 PHP
54个提高PHP程序运行效率的方法
2015/07/19 PHP
yii2 RBAC使用DbManager实现后台权限判断的方法
2016/07/23 PHP
cakephp2.X多表联合查询join及使用分页查询的方法
2017/02/23 PHP
PHP使用file_get_contents发送http请求功能简单示例
2018/04/29 PHP
javascript是怎么继承的介绍
2012/01/05 Javascript
鼠标经过tr时,改变tr当前背景颜色
2014/01/13 Javascript
AngularJS页面访问时出现页面闪烁问题的解决
2016/03/06 Javascript
jQuery获取元素父节点的方法
2016/06/21 Javascript
原生js获取浏览器窗口及元素宽高常用方法集合
2017/01/18 Javascript
详解vuejs几种不同组件(页面)间传值的方式
2017/06/01 Javascript
基于rem的移动端响应式适配方案(详解)
2017/07/07 Javascript
使用vue-route 的 beforeEach 实现导航守卫(路由跳转前验证登录)功能
2018/03/22 Javascript
JS实现的倒计时恢复按钮点击功能【可用于协议阅读倒计时】
2018/04/19 Javascript
Vue+Vant 图片上传加显示的案例
2020/11/03 Javascript
[02:20]DOTA2中文配音宣传片
2013/05/22 DOTA
Python  连接字符串(join %)
2008/09/06 Python
从零学Python之入门(五)缩进和选择
2014/05/27 Python
Python使用剪切板的方法
2017/06/06 Python
Win8.1下安装Python3.6提示0x80240017错误的解决方法
2018/07/31 Python
Python MongoDB 插入数据时已存在则不执行,不存在则插入的解决方法
2019/09/24 Python
python3.6.5基于kerberos认证的hive和hdfs连接调用方式
2020/06/06 Python
美国高端婴童品牌:Hanna Andersson
2016/10/30 全球购物
实习生自荐信范文
2013/11/13 职场文书
咖啡厅创业计划书范本
2014/01/22 职场文书
小学生新年寄语
2014/04/03 职场文书
护理专业毕业生自荐信
2014/06/15 职场文书
八项规定对照检查材料
2014/08/31 职场文书
大四优秀党员个人民主评议
2014/09/19 职场文书
四风查摆剖析材料
2014/10/10 职场文书
团代会开幕词
2015/01/28 职场文书
农业项目合作意向书
2015/05/08 职场文书
2015年高校保卫处工作总结
2015/07/23 职场文书
先进基层党组织事迹材料2016
2016/02/29 职场文书
mysql 8.0.24 安装配置方法图文教程
2021/05/12 MySQL
PostgreSQL基于pgrouting的路径规划处理方法
2022/04/18 PostgreSQL