2014年12月21日 星期日

初探 Python Decorator

最近剛巧聽到朋友介紹 Python 的 Decorator。
一開始以為是指 design pattern,後來才發現原來是Pyhton特有的一種語法糖,其實有點合成函數的味道。

舉例來說,有一個取得商品價錢的函式:
def get_price(product_id):
    ...
    return price

但是為了慶祝聖誕節,有的商品打八折,有的商品則是大打五折
而該打幾折的程式是由另一個函式判斷:
def christmas_discount(func):
    discount = get_discount()
    def get_christmas_price(product_id):
        return func(product_id) * discount
    return get_christmas_price

這時我們可以用這兩個程式合成一個新的程式:
get_price(21) // ==> 200
get_price = christmas_discount(get_price)
get_price(21) // ==> '160'

但是我們可以用 decorator語法糖「掛上」合成的函式:
@christmas_discount
def get_price(product_id):
    ...
    return price

get_price(21) // ==> '160'

Functional Programming vs OOP:

在OOP中也有所謂的裝飾者模式,具體的講解可以參考 良葛格的文章
這裡就可以看出:原本許多在OOP需要特別實作的設計模式,在Python或JavaScript等函數式語言中都能夠很直觀、輕鬆的被實作出來。
常見的Factory模式也是一樣的道理,在JS中能夠被輕易的實作。