回顧
在Python進階記錄之基礎篇(十七)中,我們介紹了Python面向對象中繼承的基本概念和簡單用法以及方法的重寫和重載的相關知識點,今天我們講一下Python面向對象中的多繼承和多态。
多繼承
多繼承是指一個類繼承兩個或兩個以上的父類,例如有類A、B、C,類C同時繼承類A和類B,就說類C多繼承了類A和類B,類C可以使用類A和類B中的屬性和方法。
Python中支援多繼承的形式,括号中填入要繼承的父類,父類之間用逗号隔開。Python中多繼承的基本寫法如下。
class 子類(父類1, 父類2, ... , 父類n): pass
現在我們定義三個類A、B和C,并讓類C同時繼承類A和類B。
Python多繼承
可以看到,類C既可以使用類A中的成員方法info_A( ),也能夠使用類B中的成員方法info_B( )。這裡需要注意的是,使用多繼承時,調用父類的初始化方法__init__( )時,需要指明調用的是哪一個具體父類,而不能像單繼承那樣直接使用super關鍵字調用。
多繼承可以讓子類同時繼承每個父類的屬性和方法,那麼,當父類之間具有相同名字的方法時,子類會怎麼調用呢?我們修改一下上述代碼,将類A中的成員方法info_A( )和類B中的成員方法info_B( )的方法名都修改為print_info。
父類之間有同名方法
可以看到,類C和類D都繼承了類A、B,但當調用成員方法print_info( )時,類C調用的是類A中的print_info( ),而類D調用的是類B中的print_info( )。
事實上,若父類中有相同的方法名,而在子類使用時未指定,Python會在繼承的父類中從左至右搜尋,即方法在子類中未找到時,從左到右查找父類中是否包含方法,是以會優先調用在括号中排在前面的父類的方法。
若我們在不想改變繼承順序的同時,想優先調用類B中print_info( ),隻需在子類中顯式指定即可。
顯式指定調用父類成員方法
多繼承是有繼承順序的,即優先繼承哪個類。
多态
之前已經介紹過面向對象三大特征中的封裝和繼承,那麼什麼是多态呢?多态是指同一種事物的多種形态。其實我們在之前内容中已經接觸到了多态,方法的重寫就是一種多态。
方法的重寫
實作多态的步驟就是:1、定義子類。2、重寫父類中的成員方法。3、子類調用自己的成員方法而不使用父類中的成員方法。
那麼多态有什麼用呢?我們在上述代碼的基礎上再增加一個子類Women,同樣繼承自Person,然後定義一個who_eat( )函數,該函數接受一個對象變量,功能是調用對象的成員方法eat( )。
多态的作用
可以看到,當我們給who_eat( )函數傳入子類Men的對象時,調用的就是Men中的eat( )方法;傳入子類Women的對象時,調用的就是Women中的eat( )方法。
這就是多态的好處。當多個繼承自同一個類的子類中有相同名字的成員方法時,那麼子類産生的對象就可以不必考慮具體的類型而直接調用方法。以上述代碼為例,對于一個變量,我們隻需要知道它是Person類型,而無需确切知道它的子類型,就可以放心地調用eat( )方法,而具體調用的eat( )方法是作用在Person、Men還是Women的對象上,由運作時該對象的确切類型決定,這就是多态真正的威力。
總結
以上内容介紹了Python面向對象中多繼承和多态的相關知識點,需要重點掌握多繼承的基本用法,注意多繼承的繼承順序,了解多态的概念和意義。面向對象是一種程式設計思想,我們要了解它的精髓,才能更好地使用面向對象程式設計。感謝大家的支援與關注,歡迎一起學習交流~