深入浅出学习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用fork来创建子进程注意事项
Jul 03 Python
Python获取网页上图片下载地址的方法
Mar 11 Python
Python快速从注释生成文档的方法
Dec 26 Python
python如何修改装饰器中参数
Mar 20 Python
tensorflow学习笔记之简单的神经网络训练和测试
Apr 15 Python
Python Requests库基本用法示例
Aug 20 Python
Django unittest 设置跳过某些case的方法
Dec 26 Python
Python实现括号匹配方法详解
Feb 10 Python
wxPython修改文本框颜色过程解析
Feb 14 Python
Python Tkinter图形工具使用方法及实例解析
Jun 15 Python
Python 微信公众号文章爬取的示例代码
Nov 30 Python
查找适用于matplotlib的中文字体名称与实际文件名对应关系的方法
Jan 05 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
一个取得文件扩展名的函数
2006/10/09 PHP
CodeIgniter上传图片成功的全部过程分享
2013/08/12 PHP
laravel5.0在linux下解决.htaccess无效和去除index.php的问题
2019/10/16 PHP
Javascript下IE与Firefox下的差异兼容写法总结
2010/06/18 Javascript
js 遍历对象的属性的代码
2011/12/29 Javascript
JQuery实现倒计时按钮具体方法
2013/11/14 Javascript
js单词形式的运算符
2014/05/06 Javascript
jQuery ui 利用 datepicker插件实现开始日期(minDate)和结束日期(maxDate)
2014/05/22 Javascript
JavaScript获取表单内所有元素值的方法
2015/04/02 Javascript
基于JavaScript如何实现ajax调用后台定义的方法
2015/12/29 Javascript
AngularJS extend用法详解及实例代码
2016/11/15 Javascript
jQuery使用DataTable实现删除数据后重新加载功能
2017/02/27 Javascript
vue2.0多条件搜索组件使用详解
2020/03/26 Javascript
浅析JavaScript中的平稳退化(graceful degradation)
2017/07/24 Javascript
react学习笔记之state以及setState的使用
2017/12/07 Javascript
Vue Router history模式的配置方法及其原理
2019/05/30 Javascript
优雅的处理vue项目异常实战记录
2019/06/05 Javascript
vue中 v-for循环的用法详解
2020/02/19 Javascript
JavaScript编码小技巧分享
2020/09/17 Javascript
python BeautifulSoup设置页面编码的方法
2015/04/03 Python
python基于pyDes库实现des加密的方法
2017/04/29 Python
pycharm中连接mysql数据库的步骤详解
2017/05/02 Python
python urllib urlopen()对象方法/代理的补充说明
2017/06/29 Python
python中闭包Closure函数作为返回值的方法示例
2017/12/17 Python
手把手教你如何安装Pycharm(详细图文教程)
2018/11/28 Python
美国知名的时尚购物网站:Anthropologie
2016/12/22 全球购物
.NET程序员的几道面试题
2012/06/01 面试题
个人素质的自我评价分享
2013/12/16 职场文书
优秀小学生家长评语
2014/01/30 职场文书
幼儿园父亲节活动方案
2014/03/11 职场文书
计划生育宣传标语
2014/06/21 职场文书
2014年大学生工作总结
2014/11/20 职场文书
项目经理助理岗位职责
2015/04/13 职场文书
郭明义电影观后感
2015/06/08 职场文书
2016年教师党员承诺书范文
2016/03/24 职场文书
python基础之//、/与%的区别详解
2022/06/10 Python