[Python教學] decorator 裝飾詞原理到應用

python decorator 裝飾詞

Python 裝飾詞 (Decorator) 被大量廣泛的使用在各方 library,是非常實用和必須了解的基礎,本篇介紹了從原理到應用,建議讀者可以跟著敲一次 code,會對裝飾詞有更深入的了解唷~

為什麼需要裝飾詞 decorator?

  1. 降低程式碼重複率
  2. 易讀性高
  3. 靈活度高

Python 裝飾詞的原理

▍開始前我們先了解:什麼是 變數名 與 函式物件 (object)

首先我們定義一個函式 def foo():

如果我們 print(foo),會得到 “function foo at 0x1028831e0” 表示 foo 是一個變數名,並且指向一個函式物件 (object)
如果要調用函式的話,則加上(), foo(),即可調用函式。

▍什麼是裝飾詞 decorator:

首先我們在 def timer(func): 將 func 變數名稱傳入,接下來定義 def wrap(sleep_time) 函式,並且在裡面將剛剛傳入的 func(sleep_time) 調用,這樣就完成一個簡單的裝飾詞囉!

1. 語法糖 (Syntax Candy)

如果不想寫成 foo = timer(dosomething),只需要加上 @timer,並直接調用 dosomething() 函式執行

2. 裝飾詞的副作用:函式名稱

裝飾詞在被 wrap 包一層後,其 __name__ 屬性就會被修改成 wrap

如果要消除這個副作用的話,可以使用 python 內建的 functools,只需要在 def wrap()之前,加上 @wraps(func),即可獲得原先的 __name__ 屬性 dosomething。

3. 裝飾詞的觸發先後順序

如果有兩個 Decorator 裝飾詞要使用的話怎麼辦,其實只需要加在上面一行即可,順序的話會從上而下觸發

4. 裝飾詞的參數 (*args, **kargs)

只需在 def wrap() 和 func() 中加入 *args, **kargs 即可調用參數,範例如下:

5. 用 Class 寫裝飾詞

如果是 Class 的方法來寫裝飾詞的話,會將 wrap 寫在 __call__ 裡面來調用,範例如下:

本篇簡單的介紹了裝飾詞的原理、語法糖的使用、函式名稱的副作用、觸發的先後順序、帶參數和如何使用 Class來寫裝飾詞,建議可以實際將 code 打一次,會對裝飾詞有更深的了解唷~

關於 Python 物件導向教學的延伸閱讀:

▍本站的其他相關教學:

那麼 [Python教學] 裝飾詞原理到應用 結束囉,感謝收看!如有任何問題,歡迎底下留言或私訊,我會盡快回覆您

發佈留言

發佈留言必須填寫的電子郵件地址不會公開。 必填欄位標示為 *