Python Decorator 入門教學 - TechBridge 技術共筆部落格

文章推薦指數: 80 %
投票人數:10人

透過一個簡單抽象化例子,我們可以一窺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



請為這篇文章評分?