深入浅出学习python装饰器


Posted in Python onSeptember 29, 2017

之前就了解到了装饰器, 但是就会点皮毛, 而且对其调用方式感到迷茫,正好现在的项目我想优化,就想到了用装饰器, 因此深入研究了下装饰器.

先看下代码:

import time


# 将函数作为参数传入到此方法....
def timeif(func):
  def wrapper(arg):
    print("in wrapper() %s" % (arg))
    start = time.clock()
    func(arg)
    end = time.clock()
    print("used: %s %s" % (end-start, arg))
  return wrapper


@timeif
def foo(arg):
  print("in foo() %s" % (arg))


if __name__ == '__main__':
  foo(" Hello ") # 表示执行foo函数....

我的疑惑就是明明return 的是一个函数名,按道理来讲,返回的就是一个函数地址啊!我理解有问题?随后上网查资料,又是闭包....但是我个人对它不感冒,随后自己分析,总结出了一段程序,看完你就知道原因了.
程序:

# coding=utf-8
# 带参数的函数 返回一个函数地址就行....
def funX(x):
  def funY():
    return x
  return funY


# 不带参数的函数....
def funX1():
  print("调用函数funX1")

  def funY1():
    print("调用函数funY1")
  return funY1


if __name__ == '__main__':
  # print(funX(5)()) # 调用有参数的嵌套函数...
  
  print(funX1()()) # 调用无参数的嵌套函数...

这和我们的装饰器不像吗?这就是我们的装饰器!因此,我们可以按照上面的程序来理解,也就是说它是首先确定参数个数,随后分别传入的,下面,我们来改写代码:

# coding=utf-8
import time


# 将函数作为参数传入到此方法....
def timeif(func):
  def wrapper(arg):
    print("in wrapper() %s" % (arg))
    start = time.clock()
    func(arg)
    end = time.clock()
    print("used: %s %s" % (end-start, arg))
  return wrapper


# @timeif
def foo(arg):
  print("in foo() %s" % (arg))


if __name__ == '__main__':
  timeif(foo)(' Hello')

深入浅出学习python装饰器

深入浅出学习python装饰器

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

Python 相关文章推荐
Python matplotlib绘图可视化知识点整理(小结)
Mar 16 Python
python实现多张图片拼接成大图
Jan 15 Python
将string类型的数据类型转换为spark rdd时报错的解决方法
Feb 18 Python
python mysql断开重连的实现方法
Jul 26 Python
关于Python3 类方法、静态方法新解
Aug 30 Python
在Python中使用filter去除列表中值为假及空字符串的例子
Nov 18 Python
Python小整数对象池和字符串intern实例解析
Mar 21 Python
Python基于pyecharts实现关联图绘制
Mar 27 Python
Python selenium文件上传下载功能代码实例
Apr 13 Python
详解Tensorflow不同版本要求与CUDA及CUDNN版本对应关系
Aug 04 Python
python matplotlib工具栏源码探析二之添加、删除内置工具项的案例
Feb 25 Python
opencv检测动态物体的实现
Jul 21 Python
Python连接phoenix的方法示例
Sep 29 #Python
Python矩阵常见运算操作实例总结
Sep 29 #Python
利用python求解物理学中的双弹簧质能系统详解
Sep 29 #Python
python中装饰器级连的使用方法示例
Sep 29 #Python
python中map()函数的使用方法示例
Sep 29 #Python
python中reduce()函数的使用方法示例
Sep 29 #Python
Django Admin 实现外键过滤的方法
Sep 29 #Python
You might like
PHP mail 通过Windows的SMTP发送邮件失败的解决方案
2009/05/27 PHP
smarty 缓存控制前的页面静态化原理
2013/03/15 PHP
PHP在线生成二维码代码(google api)
2013/06/03 PHP
使用javascript访问XML数据的实例
2006/12/27 Javascript
window.opener用法和用途实例介绍
2013/08/19 Javascript
Bootstrap和Angularjs配合自制弹框的实例代码
2016/08/24 Javascript
微信小程序 基础组件与导航组件详细介绍
2017/02/21 Javascript
微信小程序 PHP生成带参数二维码
2017/02/21 Javascript
正则表达式基本语法及表单验证操作详解【基于JS】
2017/04/07 Javascript
socket.io学习教程之基础介绍(一)
2017/04/29 Javascript
vuejs使用递归组件实现树形目录的方法
2017/09/30 Javascript
Angular 组件之间的交互的示例代码
2018/03/24 Javascript
electron踩坑之remote of undefined的解决
2020/10/06 Javascript
[02:08]2014DOTA2国际邀请赛 430专访:力争取得小组前二
2014/07/11 DOTA
[05:29]2014DOTA2国际邀请赛 赛后专访:LGDNewbee顺利过关
2014/07/13 DOTA
分享一个常用的Python模拟登陆类
2015/03/29 Python
python中尾递归用法实例详解
2015/04/28 Python
使用python实现ANN
2017/12/20 Python
对python中array.sum(axis=?)的用法介绍
2018/06/28 Python
python实现文件助手中查看微信撤回消息
2019/04/29 Python
Python3日期与时间戳转换的几种方法详解
2019/06/04 Python
pytorch 预训练层的使用方法
2019/08/20 Python
Python re正则表达式元字符分组()用法分享
2020/02/10 Python
基于logstash实现日志文件同步elasticsearch
2020/08/06 Python
Python利用myqr库创建自己的二维码
2020/11/24 Python
CSS3 Pie工具推荐--让IE6-8支持一些优秀的CSS3特性
2014/09/02 HTML / CSS
H5混合开发app如何升级的方法
2018/01/10 HTML / CSS
琳达·法罗眼镜英国官网:Linda Farrow英国
2021/01/19 全球购物
程序集与命名空间有什么不同
2014/07/25 面试题
飞利信loadrunner和软件测试笔试题
2012/09/22 面试题
关爱留守儿童标语
2014/06/18 职场文书
纪检干部现实表现材料
2014/08/21 职场文书
网站文案策划岗位职责
2015/04/14 职场文书
停发工资证明范本
2015/06/12 职场文书
婚礼家长致辞
2015/07/27 职场文书
导游词之苏州阳澄湖
2019/11/15 职场文书