TechBridge 技術共筆部落格

var topics = ['Web前後端', '行動網路', '機器人/物聯網', '數據分析', '產品設計', 'etc.']

Python Decorator 入門教學


 如何使用 Python 學習機器學習(Machine Learning)

前言

Python 是近來十分火紅的程式語言,不管是網站開發、遊戲開發或是資料科學都可以看見 Python 的身影,本系列文章將透過複習 Python 小 tips,讓讀者可以重新認識 Python。這次我們先來認識一下 Decorator 這個看似怪異但卻常被使用的設計模式。

什麼是 Decorator

簡單來說 Decorator 程式語言的設計模式,也是一種特殊的 function(例如:把 function 當做參數傳入,再把 function 傳回),透過 Decorator 可以將加上 Decorator 的 function 加上更多能力,重用許多程式碼。而在 Python 中我們則是使用 @ 當做 Decorator 使用的語法糖符號。

製作第一個 Python Decorator

透過一個簡單抽象化例子,我們可以一窺 Python Decorator 的樣貌:

1
2
3
@my_decorator
def my_func(stuff):
do_things()

我們可以看到 @my_decorator 這個 Decorator 語法糖被加在 my_func 之上。而上面的程式碼其實等於,將 my_func 當做參數傳入 my_decorator 中:

1
2
3
4
def my_func(stuff):
do_things()

my_func = my_decorator(my_func)

看起來 Decorator 好像蠻方便的。但讀者內心一定會開始思考究竟 Decorator 常用嗎?或是會有了使用在哪些地方?等問題。事實上在實務上,Python 應用程式有許多地方都可以看到 Decorator 使用的蹤影,舉凡登入驗證、日誌 logging 等地方。

下面是一個簡單範例,主要是讓每次使用者在瀏覽 payment 頁面時流量要檢查使用者是否有登入進行頁面權限管理,若沒有則回傳 403 沒有權限訪問,若有則繼續往後送去 render 出頁面。
由於很適合使用 Decorator 來撰寫的情境,所以可以建立一個 Decorator 來當做每次是否呈現頁面的權限管理機制。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
from flask import abort
# wraps 是一個製作 Decorator 好工具,也可以把參數傳入
from functools import wraps

def check_login():
# 做一些檢查

def login_required(fun):
"""
Required user to login
"""
@wraps(fun)
# wraps 可協助傳入參數做操作
def wrapper(*args, **kwds):
if check_login() is None:
return abort(403)

return fun(*args, **kwds)
return wrapper

Python Flask Web 應用程式的 routing(payment 頁面加上了 @login_required),代表有驗證登入的使用者才能看到該頁面:

1
2
3
4
@payment_blueprint.route('/payment')
@login_required
def get_payment_page():
return render_template('payment/index.html')

總結

以上就是 Python Decorator 簡單用法介紹,事實上關於 Python Decorator 還有許多進階應用可以去發掘,而中文的裝飾器翻譯又常常會讓人有所誤解,需要自己動手實作才能比較理解相關概念。本系列文章接下來也將透過複習 Python 小 tips,讓讀者可以重新認識 Python。

延伸閱讀

  1. 理解 Python 装饰器看这一篇就够了
  2. Advanced Uses of Python Decorators

關於作者:
@kdchang 文藝型開發者,夢想是做出人們想用的產品和辦一所心目中理想的學校。A Starter, Software Engineer & Maker. JavaScript, Python & Arduino/Android lover.:)

(image via kleiber

喜歡我們的文章嗎?歡迎分享按讚給予我們支持和鼓勵!





訂閱 TechBridge Weekly 技術週刊,每週發送最精華的技術開發、產品設計的資訊給您



TechBridge Weekly 技術週刊編輯團隊

TechBridge Weekly 技術週刊團隊是一群對用技術改變世界懷抱熱情的團隊。本技術共筆部落格初期專注於Web前後端、行動網路、機器人/物聯網、資料科學與產品設計等技術分享。This is TechBridge Weekly Team Tech Blog, which focus on web, mobile, robotics, IoT, Data Science technology sharing.

關於我們 / 技術日報 / 技術週刊 / 粉絲專頁 / 訂閱RSS

留言討論