2016年8月11日 星期四

Python的decorator

在Design Pattern中,有decorator pattern,它的發明是為了讓物件導向語言中,可以有function套function的作用。

而物件導向語言之前,寫這個東西可是一點都不困難的。
一直到「萬物皆物件」的限制出現之後,實現一些過去不困難實現的法,當時變成了一個困擾,才慢慢產生Design Pattern的。

而在Design Pattern之後的語言,面對這樣的問題又要如何解呢?
今天我們來用一個超級無敵簡易的例子來看看python怎麼做的。

C++

先說說C++(無物件導向寫法)是怎麼做的
#include<iostream>

using std::cout;
using std::endl;

typedef int(*F_Ptr)();

F_Ptr Afunction(F_Ptr function_ptr)
{
    cout << "Afunction" << endl;
    return function_ptr;
}

int Bfunction()
{
    cout << "Bfunction" << endl;
}

F_Ptr call_decorator = Afunction(Bfunction);

int main()
{
    call_decorator();
    return 0;
}
顯示:
Afunction
Bfunction

如果要使用物件導向語言(ex: Java)就直接去看Design Pattern吧!^^

Python

接下來就來看看python要怎麼做了。
def Afunction(n):
    print("Afunction")
    return n

@Afunction
def Bfunction(n):
    print("Bfunction")

Bfunction('b')
顯示:
Afunction
Bfunction

結論


  • 在C/C++的寫法中
    各別宣告了Afunction和Bfunction,並且再另外寫一段,將它們組合起來。


  • 而在python中
    各別宣告了Afunction和Bfunction,在Bfunction上加上@Afunction就是組合起來了,不過,也就失去了原本的Bfunciton了,除非拿掉@Afunction或另外想辦法了。


參考資料

[1] [python] decorator 之很難理解的快速理解法

沒有留言:

張貼留言