深入浅出学习python装饰器

 更新时间:2017年09月29日 15:03:20   作者:又见阿郎  
这篇文章主要和大家一起深入浅出的学习python装饰器的相关资料,具有一定的参考价值,感兴趣的小伙伴们可以参考一下

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

先看下代码:

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机器学习之KNN分类算法

    python机器学习之KNN分类算法

    这篇文章主要为大家详细介绍了python机器学习之KNN分类算法,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2018-08-08
  • 基于Django的乐观锁与悲观锁解决订单并发问题详解

    基于Django的乐观锁与悲观锁解决订单并发问题详解

    这篇文章主要介绍了基于Django的乐观锁与悲观锁解决订单并发问题详解,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2019-07-07
  • 将Python文件打包成.EXE可执行文件的方法

    将Python文件打包成.EXE可执行文件的方法

    目前有好几种方法可以将python文件打包成exe应用程序文件,例如py2exe,pyinstaller等,比较下来,还是觉得pyinstaller使用起来比较简单。
    2019-08-08
  • python创建Flask Talisman应用程序的步骤详解

    python创建Flask Talisman应用程序的步骤详解

    Flask是一个功能强大的Web框架,主要用于使用Python语言开发有趣的Web应用程序,Talisman基本上是一个Flask扩展,用于添加HTTP安全标头我们的Flask应用程序易于实施,本文就给大家讲讲带Talisman的Flask安全性,需要的朋友可以参考下
    2023-09-09
  • python实现跳表SkipList的示例代码

    python实现跳表SkipList的示例代码

    这篇文章主要介绍了python实现跳表SkipList的示例代码,代码简单易懂,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2021-07-07
  • 用 Python 制作地球仪的方法

    用 Python 制作地球仪的方法

    这篇文章主要介绍了如何用 Python 制作地球仪,本文通过实例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考即将价值,需要的朋友可以参考下
    2020-04-04
  • 使用OpenCV-python3实现滑动条更新图像的Canny边缘检测功能

    使用OpenCV-python3实现滑动条更新图像的Canny边缘检测功能

    这篇文章主要介绍了使用OpenCV-python3实现滑动条更新图像的Canny边缘检测功能,本文给大家介绍的非常详细,具有一定的参考借鉴价值,需要的朋友可以参考下
    2019-12-12
  • Python实现批量下载文件的示例代码

    Python实现批量下载文件的示例代码

    下载文件是我们在日常工作中常常要做的一件事情,当我们需要从互联网上批量下载大量文件时,手动一个一个去下载显然不够高效,所以本文为大家介绍一下如何利用python批量下载文件吧
    2023-11-11
  • 解决Python调用df.to_csv()出现中文乱码的问题

    解决Python调用df.to_csv()出现中文乱码的问题

    在Python使用df.to_csv()时,若出现中文乱码,可通过加入参数encoding="utf_8_sig"解决,"utf-8"编码不包含BOM,直接处理文件时会将BOM误读为内容;而"utf_8_sig"会识别并处理BOM,避免乱码,此方法为实践经验,供参考
    2024-09-09
  • java中的控制结构(if,循环)详解

    java中的控制结构(if,循环)详解

    这篇文章简单地介绍了java中的控制结构(if,循环)文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,下面我们来学习下吧
    2019-06-06

最新评论