深入浅出学习python装饰器

yipeiwu_com6年前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设计】。

相关文章

目前最全的python的就业方向

目前最全的python的就业方向

Python是一门面向对象的编程语言,编译速度超快,从诞生到现在已经25个年头了。它具有丰富和强大的库,常被称为“胶水语言”,能够把用其他语言编写的各种模块(尤其是C/C++)很轻松地联...

详解python中的hashlib模块的使用

hashlib hashlib主要提供字符加密功能,将md5和sha模块整合到了一起,支持md5,sha1, sha224, sha256, sha384, sha512等算法 hash...

Python实现翻转数组功能示例

本文实例讲述了Python实现翻转数组功能。分享给大家供大家参考,具体如下: 题目描述 给定一个长度为n的整数数组a,元素均不相同,问数组是否存在这样一个片段,只将该片段翻转就可以使整个...

对Python中列表和数组的赋值,浅拷贝和深拷贝的实例讲解

对Python中列表和数组的赋值,浅拷贝和深拷贝的实例讲解 列表赋值: >>> a = [1, 2, 3] >>> b = a >>&...

python list中append()与extend()用法分享

1. 列表可包含任何数据类型的元素,单个列表中的元素无须全为同一类型。 2.  append() 方法向列表的尾部添加一个新的元素。只接受一个参数。3.  exten...