Python Decorator 入門教學 - TechBridge 技術共筆部落格
文章推薦指數: 80 %
透過一個簡單抽象化例子,我們可以一窺Python Decorator 的樣貌。
首先我們先定義被裝飾函式: my_func 和裝飾器函式 my_decorator 。
TechBridge技術共筆部落格
Menu
Home
About
Tags
Archives
RSS
SignIn
前言
Python是近來十分火紅的程式語言,不管是網站開發、遊戲開發或是資料科學都可以看見Python的身影,本系列文章將透過複習Python小tips,讓讀者可以重新認識Python。
這次我們先來認識一下Decorator這個看似怪異但卻常被使用的設計模式。
什麼是Decorator
簡單來說Decorator程式語言的設計模式,也是一種特殊的function(把被裝飾函式當做參數傳入裝飾器函式,再把被裝飾函式傳回),透過Decorator可以將加上Decorator的function加上更多能力,重複利用許多程式碼。
而在Python中我們則是使用@當做Decorator使用的語法糖符號(語法糖指的是簡化寫法)。
製作第一個PythonDecorator
透過一個簡單抽象化例子,我們可以一窺PythonDecorator的樣貌。
首先我們先定義被裝飾函式:my_func和裝飾器函式my_decorator。
defmy_decorator(func):
print('裝飾器加點料')
returnfunc
defmy_func():
print('被裝飾函式執行')
my_func=my_decorator(my_func)
my_func()
執行結果:
裝飾器加點料
被裝飾函式執行
我們可以看到@my_decorator這個Decorator語法糖被加在my_func之上。
而上面的程式碼其實等於,將my_func當做參數傳入my_decorator中,簡化寫法如下:
defmy_decorator(func):
print('裝飾器加點料')
returnfunc
@my_decorator
defmy_func():
print('被裝飾函式執行')
my_func()
執行結果:
裝飾器加點料
被裝飾函式執行
看起來Decorator好像蠻方便的。
但讀者內心一定會開始思考究竟Decorator常用嗎?或是會有了使用在哪些地方?等問題。
事實上在實務上,Python應用程式有許多地方都可以看到Decorator使用的蹤影,舉凡登入驗證、日誌logging等地方。
下面是一個簡單範例,主要是讓每次使用者在瀏覽payment頁面時流量要檢查使用者是否有登入進行頁面權限管理,若沒有則回傳403沒有權限訪問,若有則繼續往後送去render出頁面。
由於很適合使用Decorator來撰寫的情境,所以可以建立一個Decorator來當做每次是否呈現頁面的權限管理機制。
fromflaskimportabort
#wraps是一個製作Decorator工具,可以把參數傳入的func進行進行拷貝不影響到原來的被裝飾函式
fromfunctoolsimportwraps
defcheck_login():
#做一些檢查
deflogin_required(func):
"""
Requiredusertologin
"""
@wraps(func)
#wraps可協助傳入參數做操作
defwrapper(*args,**kwds):
ifcheck_login()isNone:
returnabort(403)
returnfunc(*args,**kwds)
returnwrapper
PythonFlaskWeb應用程式的routing(payment頁面加上了@login_required),代表有驗證登入的使用者才能看到該頁面:
@payment_blueprint.route('/payment')
@login_required
defget_payment_page():
returnrender_template('payment/index.html')
總結
以上就是PythonDecorator簡單用法介紹,事實上關於PythonDecorator還有許多進階應用可以去發掘,而中文的裝飾器翻譯又常常會讓人有所誤解,需要自己動手實作才能比較理解相關概念。
本系列文章接下來也將透過複習Python小tips,讓讀者可以重新認識Python。
延伸閱讀
理解Python装饰器看这一篇就够了
AdvancedUsesofPythonDecorators
Pythonfunctools.wraps深入理解
關於作者:
@kdchang文藝型開發者,夢想是做出人們想用的產品和辦一所心目中理想的學校。
AStarter,SoftwareEngineer&Maker.JavaScript,Python&Arduino/Androidlover.:)
(imageviakleiber)
#PythonDecorator裝飾器
KDChang
Follow
Following
Founder@TechBridge/CoderBridge
文藝型開發者,夢想是做出人們想用的產品和辦一所心目中理想的學校。
AStarter,SoftwareEngineer&Maker.JavaScript,Python&Arduino/Androidlover.:)
Facebook
RelatedPosts
第二週(04/19~04/25):程式基礎(上)
Torai
CheckedandUncheckedExceptioninJava
terricom
.NetMVCauthorizationControllerandWorkcontextextensioninrazorview
feliiiii
Newsletter
Subscribe
Comments
Submit
SignIntojoininthediscussion.
Edit
Submit
Edit
Submit
Reply
Submit
延伸文章資訊
- 1Hans Shih — 萬惡的Python Decorator 究竟是什麼?
初學Python 時,我覺得decorator 很難理解,Google 到幾篇中英文網誌,每篇講的都不太一樣,只好把網誌多看幾遍,拼拼湊湊找線索,終於理解decorator 是什麼,趕快來寫 ...
- 2Python Decorators: How to Use it and Why? - Programiz
Decorators in Python ... Python has an interesting feature called decorators to add functionality...
- 3DAY09-搞懂Python的裝飾器 - iT 邦幫忙
眼尖的讀者可以看到一個特別的符號 @ 這就是人稱Python @ 語法糖的東西,它可以讓你的程序變得 ... def printArg(arg): def decorator(func): de...
- 4Primer on Python Decorators
In this introductory tutorial, we'll look at what Python decorators are and how to create and use...
- 5[Python教學] 裝飾詞原理到應用 - MAX行銷誌
Python 裝飾詞(Decorator) 被大量廣泛的使用在各方library,是非常實用和必須了解的基.