python装饰器

作者: Foreally | 来源:发表于2019-08-20 16:08 被阅读0次

    python装饰器通俗易懂的解释!

    定义一个函数:

    def sum1():
        sum = 1+ 2
        print (sum)
    

    想看看这个函数执行用了多长时间,所以写了几句代码插进去了:

    import time
    
    def sum1():
        start = time.clock()
        sum = 1+2
        print(sum)
        end = time.clock()
        print("time used:",end - start)
    
    sum1()
    

    运行之后,完美~~

    可是随着继续翻看,小P对越来越多的函数感兴趣了,都想看下他们的运行时间如何,难道要一个一个的去改函数吗?当然不是!我们可以考虑重新定义一个函数timeit,将sum1的引用传递给他,然后在timeit中调用sum1并进行计时,这样,我们就达到了不改动sum1定义的目的,而且,不论小P看了多少个函数,我们都不用去修改函数定义了!

    import time
    
    def sum1():
        sum = 1+ 2
        print (sum)
    
    def timeit(func):
        start = time.clock()
        func()
        end =time.clock()
        print("time used:", end - start)
    
    timeit(sum1)
    

    咂一看,没啥问题,可以运行!但是还是修改了一部分代码,把sum1() 改成了timeit(sum1)。这样的话,如果sum1在N处都被调用了,你就不得不去修改这N处的代码。所以,我们就需要杨sum1()具有和timeit(sum1)一样的效果,于是将timeit赋值给sum1。可是timeit是有参数的,所以需要找个方法去统一参数,将timeit(sum1)的返回值(计算运行时间的函数)赋值给sum1。

    import time
    
    def sum1():
        sum = 1+ 2
        print (sum)
    
    def timeit(func):
        def test():
            start = time.clock()
            func()
            end =time.clock()
            print("time used:", end - start)
        return test
    
    sum1 = timeit(sum1)
    sum1()
    

    这样一个简易的装饰器就做好了,我们只需要在定义sum1以后调用sum1之前,加上sum1= timeit(sum1),就可以达到计时的目的,这也就是装饰器的概念,看起来像是sum1被timeit装饰了!Python于是提供了一个语法糖来降低字符输入量。

    import time
      
    def timeit(func):
         def test():
             start = time.clock()
             func()
             end =time.clock()
             print("time used:", end - start)
         return test
     
    @timeit
    def sum1():
         sum = 1+ 2
         print (sum)
    
     sum1()
    

    重点关注第11行的@timeit,在定义上加上这一行与另外写sum1 = timeit(sum1)完全等价。

    示例:

    #!/usr/bin/python
    import time
    
    def sum1():
        sum = 1+ 2
        print (sum)
    
    def timeit(func):
        def test():
            start = time.clock()
            func()
            end =time.clock()
            print("time used:", end - start)
        return test
    
    def ppp():
            for i in ['a','b','c']:
                    time.sleep(1)
                    print i
    ppp = timeit(ppp)
    ppp()
    sum1 = timeit(sum1)
    sum1()
    

    运行结果:

    [root@dev ~]# python d.py 
    a
    b
    c
    ('time used:', 0.0)
    3
    ('time used:', 0.0)
    

    相关文章

      网友评论

        本文标题:python装饰器

        本文链接:https://www.haomeiwen.com/subject/wfvpsctx.html