面向物件(2)
阿新 • • 發佈:2021-12-06
面向物件的三大特徵
面向物件的三大特徵:封裝,繼承,多型。
繼承
繼承就是新建類的一種的方式,新建的類我們稱為子類或者叫派生類,被繼承的類外賣叫父類或者基類。子類可以使用父類中的屬性或者方法。
為什麼要用繼承:
類解決了物件與物件之間的程式碼冗餘問題,繼承解決了類與類之間的程式碼冗餘問題。
如何使用:
在繼承方面python2和python3是有區別的,python2分新式類和經典類,區分標準在於是否繼承object類。在python3中自動預設繼承了object。
子類呼叫父類
子類繼承了父類,子類自動擁有了父類所有的屬性,那麼子類如果呼叫父類的方法呢?
圖中1:指名道姓地呼叫,那麼這種呼叫和繼承其實沒有多大關係,就算沒有繼承也是可以實現的。
圖中2:用super()關鍵字,在python2中,括號內需要寫上類名+self,但是python3中可以省略掉。
繼承下的屬性查詢
單繼承:自下而上找,現在物件本身的名稱空間找,再從子類中找,找不到再往上到父類中查詢。一直到找到為止,找不到報錯。
多繼承:新式類廣度優先,經典類深度優先。
super列表和mro列表
super列表
在類的繼承中同事可以,如果重新定義某個當法,該方法會覆蓋父類的同名方法,但是有時,我們希望同時實現父類的功能,這時我我們就需要呼叫父類的方法了,這時可以通過super()來實現。
但是,super方法實際上和父類沒有關聯,它是遵循mro列表工作的。
mro列表
mro列表是通過C3線性化演算法來實現的,就是一個mro列表合併所有父類的列表,並且遵循以下幾點:
(1)子類永遠在父類的前面
(2)如果有多個父類,會根據它們在列表中的順序去檢查
(3)如果下一個類中有兩種不同的合法選擇,那麼選擇第一個父類。
多型與鴨子型別
python是一門動態語言,它並不要求嚴格的繼承體系,一個物件只要看起來像鴨子,走起裡來像鴨子,那它就可以被看作是鴨子。