首頁 > 收藏

面向物件特性之二:繼承(Python進階教程)

作者:由 程式設計師程式設計學習 發表于 收藏日期:2022-07-01

派生類建構函式執行的次序是怎樣的

上一篇文章介紹了面向物件特性之——封裝(參考之前發文《面向物件特性之一:封裝(Python進階教程)》),想必大家對面向物件的這種程式設計思想應該有了一定的瞭解。今天我們再來研究一下面向物件的第二種特性——繼承;

面向物件特性之二:繼承(Python進階教程)

“繼承”從字面意思上很好理解,兒子和爸爸長的很像,性格也類似,一看就知道是親生的。但是呢,又不完全一樣,兒子擁有他自己的特徵。在程式上面,“繼承”這種思想也類似於平時我們所理解的概念。下面,讓我們接著以“快遞公司老闆”這個例子來說明“繼承”在Python中的用法和優點;

你開的快遞公司生意已經很好了,不得不再增加一個部門,這個部門是從屬於之前的“員工”部門的一個子部門,專門負責給國外的客戶收發快遞,那麼,這個子部門類可以繼承之前的“員工”部門類,從而增加一個繼承的子類,這個子類具有和其父類相同的屬性、方法,也可根據邏輯單獨在子類裡定義其他方法,這樣的類與類的關係就叫做繼承關係,我們看一下程式碼:

面向物件特性之二:繼承(Python進階教程)

父類“員工類”

這是之前建立的一個員工類,已經很熟悉了,我們寫一個最簡單的繼承類;

面向物件特性之二:繼承(Python進階教程)

子類“員工-海外類”

類的繼承的寫法

定義一個類,在這個類的類名後面將父類的類名用“()”括起來,就得到了一個子類,這樣的寫法也叫做單一繼承(還有多重繼承)。子類具有和父類一樣的屬性,一樣的方法,譬如,例項化的時候傳入姓名和年齡,將直接呼叫父類的建構函式(因為子類無建構函式)、例項化的子類直接呼叫父類的方法,也會輸出相同的資訊;

注意:

Python總是首先查詢本類的方法,如果找不到,才會到父類裡去查詢,如果找到了,就呼叫子類的方法,父類的方法將不被呼叫,比如,上例中,子類如果有自己的建構函式,在例項化的時候,將執行子類的建構函式,而不是執行父類的建構函式;

子類只繼承父類的公有屬性和公有方法;

還有一種叫法叫做“基類”和“派生類”,也是指的父類和子類的關係;

為什麼要用類的繼承

在寫程式碼的時候,如果有若干個類具有共同的屬性和方法,那麼可以將相同的屬性和方法提取出來,整理成一個父類,不同的屬性和方法封裝在自己的類中使用,則在呼叫的時候,共同的方法只需要呼叫父類的方法,就可以實現其目的,簡化了程式碼段,增強了可閱讀性,也提高了程式碼的擴充套件性;

但是,如果一味的定義父類,父類下面繼承子類,子類下面再繼承子類,這樣就會造成繼承的鏈條非常的長,當代碼有一點改動,有可能就會造成瀰漫性的改動,所以,儘量不要做過多的繼承關係;

子類怎麼呼叫父類的方法

如果子類要呼叫父類的建構函式方法,可以透過下面的方式實現:

面向物件特性之二:繼承(Python進階教程)

子類呼叫父類的構造方法

透過使用ParentClass。__init__(self,引數1,引數2……。。)或者super(childClass, self)。__init__(引數1,引數2……。。)都可以呼叫父類的建構函式方法,

注意:

子類呼叫父類構造方法時,引數必須一一對應上,否則會報錯;

第二種方法不支援多重繼承,所以儘量使用第一種;

如果子類要呼叫父類的普通方法,我們看一下下面這個例子:

面向物件特性之二:繼承(Python進階教程)

子類呼叫父類的普通方法

透過ParentClass。方法(self)或者self。方法()都可以在子類中使用父類的方法,

請注意self的位置!

多重繼承

一個子類繼承多個父類,這樣的繼承就叫做多重繼承,它的寫法是:class 子類(父類1,父類3,父類3。。。):在多重繼承下,子類將繼承所有父類的公有變數和公有方法,即在外面訪問時,可以直接訪問所有父類的公有變數和公有方法,我們用一個簡單的例子來說明:

面向物件特性之二:繼承(Python進階教程)

多重繼承

注意:

如果不明確指出,子類將呼叫第一個父類的構造方法,不會再呼叫其他父類的構造方法,一般的方法也遵循這種原則(如果方法名稱都一樣的話);

小結

繼承這種思想在面向物件的程式設計中好處多多,簡化程式碼結構,使擴充套件性變強,但是,初學者要儘量避免複雜的繼承關係,避免把自己繞進去。今天就到這裡了,謝謝大家!