深入浅出学习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创建文件和追加文件内容实例
Oct 21 Python
Python实现两个list对应元素相减操作示例
Jun 09 Python
python实现求解列表中元素的排列和组合问题
Mar 15 Python
python 命令行传入参数实现解析
Aug 30 Python
Python中itertools的用法详解
Feb 07 Python
基于spring boot 日志(logback)报错的解决方式
Feb 20 Python
Django 删除upload_to文件的步骤
Mar 30 Python
在python中修改.properties文件的操作
Apr 08 Python
小 200 行 Python 代码制作一个换脸程序
May 12 Python
Python基于正则表达式实现计算器功能
Jul 13 Python
常用的10个Python实用小技巧
Aug 10 Python
深入理解Pytorch微调torchvision模型
Nov 11 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 数组遍历顺序理解
2009/09/09 PHP
php中限制ip段访问、禁止ip提交表单的代码分享
2014/08/22 PHP
ZendFramework2连接数据库操作实例
2017/04/18 PHP
一步一步制作jquery插件Tabs实现过程
2010/07/06 Javascript
jQuery阻止冒泡和HTML默认操作
2010/11/17 Javascript
js三种排序算法分享
2012/08/16 Javascript
jquery实现ajax提交form表单的方法总结
2014/03/03 Javascript
Javascript实现div层渐隐效果的方法
2015/05/30 Javascript
jquery获取select选中值的方法分析
2015/12/22 Javascript
关于获取DIV内部内容报错的原因分析及解决办法
2016/01/29 Javascript
文本框只能输入数字的js代码(含小数点)
2016/07/10 Javascript
微信禁止下拉查看URL的处理方法
2017/09/28 Javascript
jQuery AJAX 方法success()后台传来的4种数据详解
2018/08/08 jQuery
vue-cli初始化项目中使用less的方法
2018/08/09 Javascript
vue基础之v-bind属性、class和style用法分析
2019/03/11 Javascript
jQuery中实现text()的方法
2019/04/04 jQuery
Vue Extends 扩展选项用法完整实例
2019/09/17 Javascript
jQuery实现弹幕特效
2019/11/29 jQuery
vue 将多个过滤器封装到一个文件中的代码详解
2020/09/05 Javascript
Python中除法使用的注意事项
2014/08/21 Python
Python tkinter实现的图片移动碰撞动画效果【附源码下载】
2018/01/04 Python
python中不能连接超时的问题及解决方法
2018/06/10 Python
python pandas写入excel文件的方法示例
2019/06/25 Python
python实现递归查找某个路径下所有文件中的中文字符
2019/08/31 Python
Python:合并两个numpy矩阵的实现
2019/12/02 Python
对python中 math模块下 atan 和 atan2的区别详解
2020/01/17 Python
欧舒丹美国官网:L’Occitane美国
2018/02/23 全球购物
大学生毕业求职自荐书范文
2014/02/04 职场文书
《雨点儿》教学反思
2014/04/14 职场文书
小学生暑假家长评语
2014/04/17 职场文书
简易离婚协议书范本2014
2014/10/15 职场文书
2014年业务员工作总结范文
2014/11/17 职场文书
Python中的变量与常量
2021/11/11 Python
MySQL时区造成时差问题
2022/04/13 MySQL
关于mysql中string和number的转换问题
2022/06/14 MySQL
纯CSS打字动画的实现示例
2022/08/05 HTML / CSS