今天我們要講一講面向對象的第三個特性:多態;
什麼叫做多態?從字面意思上理解,就是一個函數具有多種形態。本質上其實就是同一操作方法作用於不同的對象時,有著不同的解釋,執行不同的邏輯,產生不同的結果。今天我們還是用例子來說明在Python中多態的使用方法、注意事項和使用的優點。
多態
你還是這家快要上市的快遞公司的老闆,你手底下的部門有很多個了,其中有兩個重要的部門,一個叫做「海運部門」,可以定義成一個「海運部門類」,專門負責海上的物流快遞運輸,一個叫做「空運部門」,可以定義成一個「空運部門類」,專門負責航空的物流快遞運輸。這兩個類是「部門類」的子類,下面我們用代碼來表示一下這三個類:
在上例中,我們定義了三個類,主類叫做「部門類」,兩個子類繼承於該類,分別代表「海運部門」和「空運部門」,這兩個類除了都有自己的構造函數之外,還有著一個具有相同名稱的方法,我們暫且叫做「送貨」方法。這兩個類實例化對象後,都調用各自的「送貨」方法後,我們看到,輸出的結果是不一樣的,也就是說,它們分別執行了各自類中的方法。
像上例中,不同的對象(海運部門和空運部門)雖然執行的方法(送貨)是同一個,但是執行的結果是不一樣的,在面向對象的程序設計中,通過相同的函數方法名去執行不同的動作,可以得到不同的結果,這樣的程序設計方法就叫做多態;
多態的思想其實是一類事物具有多種形態,就像上例,「部門類」具有多種形態,分別是「海運部門」和「空運部門」。多態是與繼承結合在一起的,因此多態的概念依賴於繼承。
注意:
學習過Python的朋友都知道,Python中的變量是弱類型的,也就是說,在定義時是不用指明該變量的類型,在運行時才確定其狀態。這點和Java、C++的區別很大,所以,有些人也稱Python是一種多態語言。最明顯的例子就是我們經常在用的一個函數:「len(object)」,這個python的內置函數不僅可以計算字符的長度,而且可以計算列表、元組等其他類型的數據個數,這正是多態的一種體現。
多態性
初學的時候經常容易把多態和多態性這兩個概念搞混淆,有時候面試的時候也會問到這個問題。如果說多態是一類事物具有多種形態的話,那多態性就是不同類型的實例具有相同的調用方法,我們用下面的例子來說明:
定義一個統一的接口:「func(c,peoplenum)」,調用時參數直接填入實例化的對象,可以直接調用該類的方法(一個接口,多種實現)。
使用多態的好處
增加程序的靈活性
調用者不管類裡面的方法是通過什麼邏輯實現,都只管使用一種方法去調用;
增加程序的可擴展性
即便在「部門類」裡再擴展其他的子類,調用者也不需要更改代碼,還是使用「func(c,peoplenum)」來調用;