python學習之裝飾器

 

目前在通過慕課網學習python的裝飾器知識,感覺不是很容易理解。從網上搜羅了很多的資料,看起來感覺也是一直半解。

1)在python中,可以使用函數作爲入參或者返回值。這個有點類似於C、C++中函數指針或者函數引用

2)以下面的無參數裝飾器爲例,語句@performance def factorial(n): 相當於factorial = performance(factorial)。這一點是裝飾器中比較重要的一點。從字面上理解來看,就相當於把函數factorial裝飾了一下,以後該怎麼着還是怎麼着。就好比一個人要出門參加一場宴會,你總得要“裝飾”(打扮)一下自己吧,穿上合適的衣服,抹點香水之類的東東,然後就出門了,到了宴會的地方,還是一樣,該吃就吃,該喝就喝。

藉助於慕課網上兩個實例(無參數裝飾器和帶參數裝飾器),現在只能先記下來,慢慢深入理解。(聲明:以下問題以及代碼均來自於慕課網課程python進階的“編寫無參數decorator”和“編寫帶參數decorator”)

問題1,請編寫一個@performance,它可以打印出函數調用的時間,——無參數裝飾器

import time
def performance(f):
    def fn(*args, **kw):
        t1 = time.time()
        r = f(*args, **kw)
        t2 = time.time()
        print 'call %s() in %fs' % (f.__name__, (t2 - t1))
        return r
    return fn

@performance
def factorial(n):
    return reduce(lambda x,y: x*y, range(1, n+1))
print factorial(10)
 
問題2,上一個只能打印秒,請給@performance增加一個參數,允許傳入's'或者'ms',——帶參數裝飾器
import time
def performance(unit):
    def perf_decorator(f):
        def wrapper(*args, **kw):
            t1 = time.time()
            r = f(*args, **kw)
            t2 = time.time()
            t = (t2 - t1) * 1000 if unit=='ms' else (t2 - t1)
            print 'call %s() in %f %s' % (f.__name__, t, unit)
            return r
        return wrapper
    return perf_decorator

@performance('ms')
def factorial(n):
    return reduce(lambda x,y: x*y, range(1, n+1))
print factorial(10)

 

 
發佈了35 篇原創文章 · 獲贊 7 · 訪問量 14萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章