關於python當中的@修飾符的淺析
要了解python中@裝飾器的作用,首先要記住這麼幾點:
1. 裝飾器符號“@”屬於語法糖,什麼意思呢?就是說,我不按照@裝飾器的語法要求來寫,而是按照一般python的語法要求來寫完全可以。那麼用@裝飾器的格式來寫的目的就是為了書寫簡單方便
2. 裝飾器的作用是什麼呢? 簡單的理解就是:裝飾原有的函式。什麼意思呢?比如有一個函式func(a, b),它的功能是求a,b的差值,我現在有一個需求,就是想對函式功能再裝飾下,求完差值後再取絕對值,但是不能在func函式內部實現,這時候就需要裝飾器函數了,比如func = decorate(func)函式,將func函式作為引數傳遞給decorate函式,由decorate來豐富func函式,豐富完成後再返回給func,此時func的功能就豐富了。
3.python的常識,函式和其他任何東西一樣,都是物件。這意味著可以將函式當做實參傳遞給函式,或者在函式中將函式作為返回值返回。例碼驗證:
>>> def add(x, y):
... return x + y
>>> def sub(x, y):
... return x - y
>>> def apply(func, x, y): # 1
... return func(x, y) # 2
>>> apply(add, 2, 1) # 3
3
>>> apply(sub, 2, 1)
1
瞭解上述觀點後,可以先不用@符號來寫一個簡單的裝飾器
def decorate(func):
def inner(a, b):
ret = func(a, b):
return abs(ret)
return inner
def sub(a, b):
return a-b
>>>sub(3, 4)
... -1
>>>sub = decorate(sub)
>>>sub(3, 4)
>>>1
對於sub = decorate(sub)的理解。 最終會將inner的值傳給sub ,此時執行sub(3, 4),其實是執行decorate中的inner,所以為1.
那麼為了書寫方便,將sub=decorate(sub)換為@decorate,並放在sub的定義面前,即:
@decorate
def sub(a, b):
return a-b
只是書寫不同,結果相同。
如果上述理解還是很吃力,推薦一個更詳細的帖子,看完後你會有更透徹的理解。
http://python.jobbole.com/85056/