一、實體方法(Instance Method)
Python類別(Class)中沒有加任何裝飾詞(Decorator)的方法(Method),至少要有一個self參數,於方法(Method)被呼叫時指向物件(Object),其後可以依需求增加額外參數,如下範例:
實體方法(Instance Method)透過self參數可以自由的存取物件(Object)的屬性(Attribute)及其他方法(Method),藉此來改變物件(Object)的狀態,如下範例:
執行結果
從執行結果可以看到,我們印出self參數時,結果顯示為Cars類別的物件(Object),也就是說呼叫實體方法(Instance Method)時,Python編譯器會傳入物件(Object),使得self參數指向該物件(Object)。
另一方面,當透過類別(Class)呼叫實體方法(Instance Class)時,這會使得Python編譯器無法將self參數指向物件(Object),而發生TypeError的錯誤,如下範例:
執行結果
另外,在實體方法(Instance Method)中可以透過self.__class__屬性(Attribute)來改變類別(Class)的狀態,如下範例:
執行結果
範例中實體方法(Instance Method)即利用self.__class__屬性(Attribute)來改變door類別屬性(Class Attribute)。
二、 類別方法(Class Method)
Python類別(Class)中有@classmethod裝飾詞(Decorator)的方法(Method),被呼叫時,相較於實體方法(Instance Method)的self參數指向物件(Object),類別方法(Class Method)為cls參數,指向類別(Class),如下範例:
由於類別方法(Class Method)的cls參數指向類別(Class),所以類別方法(Class Method)僅能改變類別的狀態,而無法改變物件(Object)的狀態,因為它沒有self參數可以存取物件的屬性(Attribute)及方法(Method)。如下範例:
執行結果
執行結果顯示當類別方法(Instance Method)被呼叫時,Python編譯器會傳入類別(Class),使得cls參數指向該類別(Class),接著透過cls參數來存取類別屬性(Attribute)。
另外,Python的類別方法(Class Method)常應用於產生物件(Object),如下範例:
van及sports_car類別方法(Class Method)利用cls參數初始化物件,並且回傳。當然,以這個範例來說,不一定要透過類別方法(Class Method)來建立物件(Object),可以單純透過建構子(Constructor)即可,主要是要表達當建立物件(Object)的邏輯較複雜時,透過類別方法(Class Method)可以將邏輯封裝起來,來源端只要依需求呼叫相應的類別方法(Class Method)來建立物件(Object)即可。
就像範例中,想要跑車則呼叫跑車類別方法(Class Method)來建立跑車,至於物件(Object)的初始化過程(建造跑車的過程)封裝在類別方法中(Class Method),它會幫我們完成並回傳,就像建立物件(Object)的工廠一樣,所以類別方法(Class Method)也被稱為工廠方法(Factory Method),讓程式碼簡潔且易於維護。
三、靜態方法(Static Method)
Python類別中有@staticmethod裝飾詞(Decorator)的方法(Method),可以接受任意的參數,也因為它沒有self及cls參數,所以靜態方法(Static Method)無法改變類別(Class)及物件(Object)的狀態,如下範例:
靜態方法(Static Method)在類別(Class)中是一個獨立的方法(Method),通常應用於方法(Method)中無需存取物件(Object)的屬性(Attribute)或方法(Method),單純執行傳入參數或功能上運算的情況,如下範例:
執行結果
來源端不論透過類別(Class)或物件(Object)皆可呼叫,Python編譯器於執行期間(Runtime)不會傳入self及cls參數至靜態方法(Static Method)。
使用靜態方法(Static Method)有幾個優點是,在開發過程中可以避免新加入的開發人員意外改變類別(Class)或物件(Object)的狀態(因為方法中無self及cls參數),而影響到類別(Class)原始的設計。其二則是靜態方法(Static Method)在類別中是獨立的,所以有助於單元的測試。
四、小結
以上就是Python物件導向設計中的三種方法(Method)類型教學,希望透過此文章對於各方法(Method)的觀念及應用有進一步的認識,在練習的過程中若有碰到任何問題或說明不清楚的地方,歡迎留言與我分享!
「好文轉自古耕全–解析Python物件導向設計的3種類型方法(Instance,Class,Static Method),如果你喜歡他的文章歡迎回到他的部落格看更多:)」