你好,游客 登录 注册 搜索
背景:
阅读新闻

深入浅出理解Python 装饰器

[日期:2017-08-18] 来源:Linux社区  作者:zhiyong-ITNote [字体: ]

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

先看下代码:

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')

本文永久更新链接地址http://www.linuxidc.com/Linux/2017-08/146312.htm

linux
相关资讯       Python装饰器 
本文评论   查看全部评论 (0)
表情: 表情 姓名: 字数

       

评论声明
  • 尊重网上道德,遵守中华人民共和国的各项有关法律法规
  • 承担一切因您的行为而直接或间接导致的民事或刑事法律责任
  • 本站管理人员有权保留或删除其管辖留言中的任意内容
  • 本站有权在网站内转载或引用您的评论
  • 参与本评论即表明您已经阅读并接受上述条款