iT邦幫忙

2023 iThome 鐵人賽

DAY 24
0
Software Development

Python 微進階系列 第 24

Python 微進階 Day24 - decorator(修飾器)

  • 分享至 

  • xImage
  •  

decorator(修飾器)

  • decorator(修飾器、裝飾器):一種特別的函式,可用來輔助其他函式,例如之前在類別的方法使用了不少內建的修飾器,那其實我們也可以自行定義修飾器
  • 掛載 decorator 的函式,會先執行(裝飾) decorator 內的內容,再執行掛載 decorator 的函式內容,也就是 my_fun = decorate(my_fun),將 decorate() 指定(=)給 my_fun,因此 my_fun 會是經過 decorate() 包裝修飾過的版本
  • 使用 @ 符號來當做 decorator 所使用的語法糖符號,用來取代 my_fun = decorate(my_fun)
  • 使用 decorator 就可以很快速的重複利用這些函式,例如執行函式前先用 decorator 做一些共同的部分或判斷
  • 當有多個 decorator 時,則從下(最接近函式)而上的順序執行
  • 研究了不少資料,發現寫法各有所不同(一種愈看愈花的概念),主要在於有無參數,參數是誰傳給誰,但目的就是使用 decorator 後,會先執行 decorator 的那個函式,再執行原本的函式

decorator 語法 (from 彭彭)

  • decorator 內的函式沒有 return
  • decorator 的參數傳給函式
# decorator 語法
def decorator_fun(callback):
    def fun_name():
        # decorator code
        # result 為參數,非必要
        result = "dec"
        print(result)
        callback(result)
    return fun_name

# 使用 @decorator_fun
@decorator_fun
def test(result):
    # code
    print("fun", result)

# 若無使用 decorator
# test = decorator_fun(test)

test()
# dec
# fun dec

decorator 語法 (from steam)

  • decorator 內的函式有 return
  • 函式的參數傳給 decorator
def a(func):
    def c(m):
        # decorator code
        # m 為參數,非必要
        print("decorator", m)
        return func(m)
    return c

@a
def b(msg):
    # code
    print(msg)

b("fun")
# decorator fun
# fun

參考資料

次回

來談談 generator(產生器)


上一篇
Python 微進階 Day23 - class(類別) - 彙整
下一篇
Python 微進階 Day25 - generator(產生器)
系列文
Python 微進階31
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言