python装饰器

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)
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。