Python Decorator 入門教學
前言
Python 是近來十分火紅的程式語言,不管是網站開發、遊戲開發或是資料科學都可以看見 Python 的身影,本系列文章將透過複習 Python 小 tips,讓讀者可以重新認識 Python。這次我們先來認識一下 Decorator 這個看似怪異但卻常被使用的設計模式。
什麼是 Decorator
簡單來說 Decorator 程式語言的設計模式,也是一種特殊的 function(例如:把 function 當做參數傳入,再把 function 傳回),透過 Decorator 可以將加上 Decorator 的 function 加上更多能力,重用許多程式碼。而在 Python 中我們則是使用 @
當做 Decorator 使用的語法糖符號。
製作第一個 Python Decorator
透過一個簡單抽象化例子,我們可以一窺 Python Decorator 的樣貌:
1 |
|
我們可以看到 @my_decorator
這個 Decorator 語法糖被加在 my_func
之上。而上面的程式碼其實等於,將 my_func 當做參數傳入 my_decorator 中:
1 | def my_func(stuff): |
看起來 Decorator 好像蠻方便的。但讀者內心一定會開始思考究竟 Decorator 常用嗎?或是會有了使用在哪些地方?等問題。事實上在實務上,Python 應用程式有許多地方都可以看到 Decorator 使用的蹤影,舉凡登入驗證、日誌 logging 等地方。
下面是一個簡單範例,主要是讓每次使用者在瀏覽 payment 頁面時流量要檢查使用者是否有登入進行頁面權限管理,若沒有則回傳 403 沒有權限訪問,若有則繼續往後送去 render 出頁面。
由於很適合使用 Decorator 來撰寫的情境,所以可以建立一個 Decorator 來當做每次是否呈現頁面的權限管理機制。
1 | from flask import abort |
Python Flask Web 應用程式的 routing(payment 頁面加上了 @login_required
),代表有驗證登入的使用者才能看到該頁面:
1 |
|
總結
以上就是 Python Decorator 簡單用法介紹,事實上關於 Python Decorator 還有許多進階應用可以去發掘,而中文的裝飾器翻譯又常常會讓人有所誤解,需要自己動手實作才能比較理解相關概念。本系列文章接下來也將透過複習 Python 小 tips,讓讀者可以重新認識 Python。
延伸閱讀
關於作者:
@kdchang 文藝型開發者,夢想是做出人們想用的產品和辦一所心目中理想的學校。A Starter, Software Engineer & Maker. JavaScript, Python & Arduino/Android lover.:)
(image via kleiber)
留言討論