zoukankan      html  css  js  c++  java
  • 深入浅出理解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')

  • 相关阅读:
    idea 中使用 svn
    [剑指offer] 40. 数组中只出现一次的数字
    [剑指offer] 39. 平衡二叉树
    [剑指offer] 38. 二叉树的深度
    [剑指offer] 37. 数字在排序数组中出现的次数
    [剑指offer] 36. 两个链表的第一个公共结点
    [剑指offer] 35. 数组中的逆序对
    vscode在win10 / linux下的.vscode文件夹的配置 (c++/c)
    [剑指offer] 34. 第一个只出现一次的字符
    [剑指offer] 33. 丑数
  • 原文地址:https://www.cnblogs.com/zhiyong-ITNote/p/7384955.html
Copyright © 2011-2022 走看看