1. 程式人生 > >關於python當中的@修飾符的淺析

關於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/