python之編寫帶參數decorator

在學習帶參數的decorator之前,我們先回顧下無參數的decorator。以@log裝飾器爲例講解:

無參數decorator

def new_fn(f):
    def fn(x):
        print 'call '+f.__name__+'()'
        return f(x)
    return fn
@new_fn
def f(x):
    return x*x
print f(2)
==> call f()
==> 4

像這種裝飾器的參數除了原函數以外沒有其他參數的情況,稱爲無參數的decorator。

帶參數decorator

當函數非常重要時,需要打印出 [important] call xx();普通函數需要打印出 [debug] call xx()。這就需要將important、debug傳入裝飾器,此時裝飾器就有了除原函數以外的其他參數。

帶參數的decorator的運行過程:需要先將帶參數的decorator轉變爲無參數decorator,然後再按照無參數decorator進行運行。

def new_fn(text):
    def decorator_new_fn(f):
        def fn(x):
            print ('[%s] call ' + f.__name__ +'()') % (text)
            return f(x)
        return fn
    return decorator_new_fn
@new_fn('important')
def f(x):
    return x*x
print f(3)
==> [important] call f()
==> 9

解釋下上面代碼:先將text參數傳給裝飾器 new_fn(text), 然後再將此引用給 decorator_new_fn(f),decorator_new_fn(f)就相當是無參數時的裝飾器了。之後就按照無參數裝飾器編寫就可以了。

帶參數的裝飾器就好如 f = new_fn('important')(f)。這樣還有些饒,不好理解,爲了方便理解,一步步的引用過程如下:

decorator_new_fn = new_fn('important')

f = decorator_new_fn(f)

上面的語句又可進一步寫爲:

decorator_new_fn = new_fn('important')

@decorator_new_fn

上面的語句又可進一步寫爲:

@new_fn('important')

 

這節內容我是覺得不大好懂的,當時我學習的時候,是花費了好久才稍微懂點,這節內容與前面的閉包、高階函數都有聯繫,需要前面的掌握好,這節理解起來纔會毫不費力。近幾天我又回頭學習了閉包、高階函數的內容,也順帶回顧了下tuple、dist(原來學習的都還給老師了 ==)。我的python基礎還有兩節結束,最後幾節難度提升了,而且需要前面學習過的知識,由於前面的有遺忘,或是當時沒掌握好的,近幾天又回頭學習了遍。等我的python基礎全部學完後,我會再重新刷遍python基礎,並更新公衆號內容。大家可以關注我的公衆號,適合python小白跟着我一起學習:

 

 

 

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章