深入浅出学习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 random模块常用方法
Nov 03 Python
Python获取任意xml节点值的方法
May 05 Python
django开发教程之利用缓存文件进行页面缓存的方法
Nov 10 Python
PyQt5每天必学之事件与信号
Apr 20 Python
PyTorch读取Cifar数据集并显示图片的实例讲解
Jul 27 Python
python中ImageTk.PhotoImage()不显示图片却不报错问题解决
Dec 06 Python
对Python多线程读写文件加锁的实例详解
Jan 14 Python
python交互界面的退出方法
Feb 16 Python
python验证身份证信息实例代码
May 06 Python
浅析Django 接收所有文件,前端展示文件(包括视频,文件,图片)ajax请求
Mar 09 Python
基于python实现获取网页图片过程解析
May 11 Python
使用python matploblib库绘制准确率,损失率折线图
Jun 16 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
一个ubbcode的函数,速度很快.
2006/10/09 PHP
用 PHP5 轻松解析 XML
2006/12/04 PHP
php正则表达式获取内容所有链接
2015/07/24 PHP
php fseek函数读取大文件两种方法
2016/10/12 PHP
PHP使用curl_multi_select解决curl_multi网页假死问题的方法
2018/08/15 PHP
js 代码集(学习js的朋友可以看下)
2009/07/22 Javascript
基于jQuery的表格操作插件
2010/04/22 Javascript
jquery获得下拉框值的代码
2011/08/13 Javascript
JavaScript实现拼音排序的方法
2012/11/20 Javascript
Web Inspector:关于在 Sublime Text 中调试Js的介绍
2013/04/18 Javascript
jquery submit ie6下失效的原因分析及解决方法
2013/11/15 Javascript
js读取json的两种常用方法示例介绍
2014/10/19 Javascript
jQuery选择器源码解读(一):Sizzle方法
2015/03/31 Javascript
JavaScript实现自动弹出窗口并自动关闭窗口的方法
2015/08/06 Javascript
JS实现选中当前菜单后高亮显示的导航条效果
2015/10/15 Javascript
原生js FileReader对象实现图片上传本地预览效果
2020/03/27 Javascript
vue中使用 pako.js 解密 gzip加密字符串的方法
2019/06/10 Javascript
mpvue实现左侧导航与右侧内容的联动
2019/10/21 Javascript
jQuery带控制按钮轮播图插件
2020/07/31 jQuery
js实现3D旋转相册
2020/08/02 Javascript
[51:17]Mski vs VGJ.S Supermajor小组赛C组 BO3 第三场 6.3
2018/06/04 DOTA
Python开发的实用计算器完整实例
2017/05/10 Python
解决使用PyCharm时无法启动控制台的问题
2019/01/19 Python
Python+Selenium使用Page Object实现页面自动化测试
2019/07/14 Python
为什么说Python可以实现所有的算法
2019/10/04 Python
如何在VSCode上轻松舒适的配置Python的方法步骤
2019/10/28 Python
韩国著名的在线综合购物网站:Akmall
2016/08/07 全球购物
如何理解委托
2012/01/06 面试题
语文教育专业应届生求职信
2013/11/23 职场文书
学校门卫管理制度
2014/01/30 职场文书
普通党员个人对照检查材料
2014/09/18 职场文书
临时租车协议范本
2014/09/23 职场文书
务工证明怎么写
2015/06/18 职场文书
用CSS3画一个爱心
2021/04/27 HTML / CSS
详解缓存穿透击穿雪崩解决方案
2021/05/28 Redis
Python TypeError: ‘float‘ object is not subscriptable错误解决
2022/12/24 Python