在學習帶參數的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小白跟着我一起學習: