zoukankan      html  css  js  c++  java
  • Python # 装饰器

    ###

    现在我有一个简单的myfunc函数,现在我想对myfunc函数增加功能。下面我们增加一个deco的功能。

    import time
    def deco(func):
        startTime = time.time()
        func()
        endTime = time.time()
        msecs = (endTime - startTime)
        print("-->elapsed time %s s"%msecs)
    
    def myfunc():
        print('start myfunc')
        time.sleep(3)
        print('end myfunc')
    
    deco(myfunc)

    但是这种方式存在一个问题,修改了myfunc的原来的调用方式:myfunc() ------> 变成了 deco(myfunc)。所以我们做了下面的改变。

    ###

    def deco(func):
        def wrapper():
            startTime = time.time()
            func()
            endTime = time.time()
            msecs = (endTime - startTime)
            print("-->elapsed time %s s"%msecs)
        return wrapper                            ###返回的是<function deco.<locals>.wrapper at 0x03234468> 可以通过wrapper()调用
    
    
    def myfunc():
    print('start myfunc')
    time.sleep(3)
    print('end myfunc')

    print("myfunc is %s"%myfunc.__name__ )
    myfunc=deco(myfunc)
    print("myfunc is %s"%myfunc.__name__ )
    myfunc()

    输出结果:

    myfunc is myfunc
    myfunc is wrapper
    start myfunc
    end myfunc
    -->elapsed time 3.0007433891296387 s

    经过了上面的改动后,一个比较完整的装饰器(deco)就实现了,装饰器没有影响原来的函数,以及函数调用的代码。

    例子中值得注意的地方是,Python中一切都是对象,函数也是,所以代码中改变了”myfunc”对应的函数对象。

    ###

    def deco(func):
        def wrapper():
            startTime = time.time()
            func()
            endTime = time.time()
            msecs = (endTime - startTime)
            print("-->elapsed time %s s"%msecs)
        return wrapper
    
    @deco
    def myfunc():
        print('start myfunc')
        time.sleep(3)
        print('end myfunc')
    
    
    myfunc()

    ###

  • 相关阅读:
    【leetcode】7. 反转整数
    【leetcode】496. 下一个更大元素 I
    【leetcode】389. 找不同
    Linux驱动模型解析bus之platform bus
    shell 和进程
    递归调用在循环体内: 把循环展开, 这种情况是先循环再递归
    javascript函数柯里化以及柯里化带来的好处
    Maven测试篇
    关于ECharts Java类库的一个jquery插件
    javascript原型链继承
  • 原文地址:https://www.cnblogs.com/lwsup/p/7523582.html
Copyright © 2011-2022 走看看