派生類建構函式執行的次序是怎樣的
上一篇文章介紹了面向物件特性之——封裝(參考之前發文《面向物件特性之一:封裝(Python進階教程)》),想必大家對面向物件的這種程式設計思想應該有了一定的瞭解。今天我們再來研究一下面向物件的第二種特性——繼承;
“繼承”從字面意思上很好理解,兒子和爸爸長的很像,性格也類似,一看就知道是親生的。但是呢,又不完全一樣,兒子擁有他自己的特徵。在程式上面,“繼承”這種思想也類似於平時我們所理解的概念。下面,讓我們接著以“快遞公司老闆”這個例子來說明“繼承”在Python中的用法和優點;
你開的快遞公司生意已經很好了,不得不再增加一個部門,這個部門是從屬於之前的“員工”部門的一個子部門,專門負責給國外的客戶收發快遞,那麼,這個子部門類可以繼承之前的“員工”部門類,從而增加一個繼承的子類,這個子類具有和其父類相同的屬性、方法,也可根據邏輯單獨在子類裡定義其他方法,這樣的類與類的關係就叫做繼承關係,我們看一下程式碼:
父類“員工類”
這是之前建立的一個員工類,已經很熟悉了,我們寫一個最簡單的繼承類;
子類“員工-海外類”
類的繼承的寫法
定義一個類,在這個類的類名後面將父類的類名用“()”括起來,就得到了一個子類,這樣的寫法也叫做單一繼承(還有多重繼承)。子類具有和父類一樣的屬性,一樣的方法,譬如,例項化的時候傳入姓名和年齡,將直接呼叫父類的建構函式(因為子類無建構函式)、例項化的子類直接呼叫父類的方法,也會輸出相同的資訊;
注意:
Python總是首先查詢本類的方法,如果找不到,才會到父類裡去查詢,如果找到了,就呼叫子類的方法,父類的方法將不被呼叫,比如,上例中,子類如果有自己的建構函式,在例項化的時候,將執行子類的建構函式,而不是執行父類的建構函式;
子類只繼承父類的公有屬性和公有方法;
還有一種叫法叫做“基類”和“派生類”,也是指的父類和子類的關係;
為什麼要用類的繼承
在寫程式碼的時候,如果有若干個類具有共同的屬性和方法,那麼可以將相同的屬性和方法提取出來,整理成一個父類,不同的屬性和方法封裝在自己的類中使用,則在呼叫的時候,共同的方法只需要呼叫父類的方法,就可以實現其目的,簡化了程式碼段,增強了可閱讀性,也提高了程式碼的擴充套件性;
但是,如果一味的定義父類,父類下面繼承子類,子類下面再繼承子類,這樣就會造成繼承的鏈條非常的長,當代碼有一點改動,有可能就會造成瀰漫性的改動,所以,儘量不要做過多的繼承關係;
子類怎麼呼叫父類的方法
如果子類要呼叫父類的建構函式方法,可以透過下面的方式實現:
子類呼叫父類的構造方法
透過使用ParentClass。__init__(self,引數1,引數2……。。)或者super(childClass, self)。__init__(引數1,引數2……。。)都可以呼叫父類的建構函式方法,
注意:
子類呼叫父類構造方法時,引數必須一一對應上,否則會報錯;
第二種方法不支援多重繼承,所以儘量使用第一種;
如果子類要呼叫父類的普通方法,我們看一下下面這個例子:
子類呼叫父類的普通方法
透過ParentClass。方法(self)或者self。方法()都可以在子類中使用父類的方法,
請注意self的位置!
多重繼承
一個子類繼承多個父類,這樣的繼承就叫做多重繼承,它的寫法是:class 子類(父類1,父類3,父類3。。。):在多重繼承下,子類將繼承所有父類的公有變數和公有方法,即在外面訪問時,可以直接訪問所有父類的公有變數和公有方法,我們用一個簡單的例子來說明:
多重繼承
注意:
如果不明確指出,子類將呼叫第一個父類的構造方法,不會再呼叫其他父類的構造方法,一般的方法也遵循這種原則(如果方法名稱都一樣的話);
小結
繼承這種思想在面向物件的程式設計中好處多多,簡化程式碼結構,使擴充套件性變強,但是,初學者要儘量避免複雜的繼承關係,避免把自己繞進去。今天就到這裡了,謝謝大家!