首页 > 编程 > Python > 正文

深入浅出学习python装饰器

2020-01-04 16:32:58
字体:
来源:转载
供稿:网友

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

先看下代码:

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@timeifdef 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 funY1if __name__ == '__main__':  # print(funX(5)()) # 调用有参数的嵌套函数...    print(funX1()()) # 调用无参数的嵌套函数...

这和我们的装饰器不像吗?这就是我们的装饰器!因此,我们可以按照上面的程序来理解,也就是说它是首先确定参数个数,随后分别传入的,下面,我们来改写代码:

# coding=utf-8import 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# @timeifdef foo(arg):  print("in foo() %s" % (arg))if __name__ == '__main__':  timeif(foo)(' Hello')

python,装饰器

python,装饰器

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持VEVB武林网。


注:相关教程知识阅读请移步到python教程频道。
发表评论 共有条评论
用户名: 密码:
验证码: 匿名发表