• 深入浅出理解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')

  • 相关阅读:
    QString 与 string转换
    Lua 判断表是否为空方法
    QT 继承QWidget && 继承QDialog
    QNetworkAccessManager
    Lua语言特色
    Lua逻辑操作符
    Lua语言总结
    Lua 函数
    Lua数据类型
    QT 通过QNetworkReply *获取对应请求的URL地址
  • 原文地址:https://www.cnblogs.com/zhiyong-ITNote/p/7384955.html
Copyright © 2020-2023  润新知