python裝飾器

python裝飾器通俗易懂的解釋!

定義一個函數(shù):

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

想看看這個函數(shù)執(zhí)行用了多長時間,所以寫了幾句代碼插進去了:

import time

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

sum1()

運行之后,完美~~

可是隨著繼續(xù)翻看,小P對越來越多的函數(shù)感興趣了,都想看下他們的運行時間如何,難道要一個一個的去改函數(shù)嗎?當然不是!我們可以考慮重新定義一個函數(shù)timeit,將sum1的引用傳遞給他,然后在timeit中調(diào)用sum1并進行計時,這樣,我們就達到了不改動sum1定義的目的,而且,不論小P看了多少個函數(shù),我們都不用去修改函數(shù)定義了!

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處都被調(diào)用了,你就不得不去修改這N處的代碼。所以,我們就需要楊sum1()具有和timeit(sum1)一樣的效果,于是將timeit賦值給sum1??墒莟imeit是有參數(shù)的,所以需要找個方法去統(tǒng)一參數(shù),將timeit(sum1)的返回值(計算運行時間的函數(shù))賦值給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以后調(diào)用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()

重點關(guān)注第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()

運行結(jié)果:

[root@dev ~]# python d.py 
a
b
c
('time used:', 0.0)
3
('time used:', 0.0)
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。

友情鏈接更多精彩內(nèi)容