每個程式語言都有它自己的特性,雖然邏輯方面語法大同小異,但有一些小小的特性是有差別的--而這些差別往往在撰寫的時候可以帶來一些便利,這種小特性我們俗稱語法糖。 而python之中也有這類語法糖,其中最常被人使用到的就是@這個裝飾子了,在許多的html類後端常常會看見他。今天,我們從flask教材中對於@的說明來稍稍了解一下裝飾子以及裝飾器的概念吧。 裝飾器是一種「將原函數作為參數帶入裝飾器指定的函式,並將回傳結果指定給原參數的名稱」的語法。文字說明可能有點抽象,我們用一個小範例來說明: ```python def printHello(func): print('world') return 'world' def printWorld(): pass printWorld = printHello(printWorld) type(printWorld) --------------result------------------ world <class 'str'> ``` 從這個簡短的範例我們看到,我們定義了兩個函數printWorld和printHello,並將printWorld作為參數傳給printHello,最後將printHello的回傳指定給printWorld。經由這些操作後,原先的printWorld已經消失,取而代之的是printHello的回傳值--我們可以藉由type函數檢查到這件事。 那裝飾器主要是幫我們簡化這行: ```python def printHello(func): print('world') return 'world' @printHello def printWorld(): pass type(printWorld) --------------result------------------ world <class 'str'> ``` 結果完全相同,但我們省略了看起來很饒舌的一行--而這就是裝飾子@幫我們做的事情。 當然,這樣原先函數就消失的結果有時候不是我們想要的。有時候,我們希望原本的功能還保持著,只是想加上一點東西而已,flask的裝飾器大多都屬於這種類型。那這種時候,我們就必須在裝飾用的函式中呼叫一次原函式,加上需要的結果後再回傳一個參數和原函式一致的新函式。我們可以參考在我們flask教材中的範例:  
×
Sign in
Email
Password
Forgot password
or
By clicking below, you agree to our
terms of service
.
Sign in via Facebook
Sign in via Twitter
Sign in via GitHub
Sign in via Dropbox
Sign in with Wallet
Wallet (
)
Connect another wallet
New to HackMD?
Sign up