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

    ###

  • 相关阅读:
    64位整数乘法
    HTML中常见问题汇总贴
    题解 牛客【「水」悠悠碧波】
    题解 CF1391B 【Fix You】
    四级-句子
    快速幂||取余运算
    最大子列和
    JvavScript中的函数与对象
    JavaScript中的流程控制语句
    冒泡排序,选择排序,插入排序,归并排序
  • 原文地址:https://www.cnblogs.com/lwsup/p/7523582.html
Copyright © 2011-2022 走看看