類的繼承
什么是繼承
繼承是一種新建類的方式,新建的類稱為子類,被繼承的類稱為父類
繼承的特性是:子類會遺傳父類的屬性
繼承是類與類之間的關系
為什么用繼承
使用繼承可以減少代碼的冗余
對象的繼承
Python中支持一個類同時繼承多個父類
class Parent1:
pass
class Parent2:
pass
class Sub1(Parent1, Parent2):
pass
對象查找屬性的順序:對象自己-》對象的類-》父類-》父類
類的派生
派生:子類中新定義的屬性的這個過程叫做派生,並且需要記住子類在使用派生的屬性時始終以自己的為准
父類中沒有的屬性 子類中出現 叫派生屬性
父類中沒有的方法 子類中出現 叫派生方法
父類和子類都有 調用子類的 想調父類的要指出父類名稱調用
class Person:
def __init__(self,name, sex, tel):
self.name = name
self.sex = sex
self.tel = tel
class Man(Person):
def __init__(self, name, sex, tel, high):
#Person.__init__(self, name, sex, tel) # 調用父類變量
super().__init__(name, sex, tel) # 可以用super方法代替上面的方法 可以省略父類名和self
self.hight = high # 派生屬性
class Woman(Person): pass
類的組合
組合就是一個類的對象具備某一個屬性,該屬性的值是指向另外外一個類的對象
當類與類之間沒有直接邏輯關系,但是需要將他們聯合起來,就可以用組合
類的分類
新式類
繼承了object的類以及該類的子類,都是新式類
Python3中所有的類都是新式類
經典類
沒有繼承object的類以及該類的子類,都是經典類
只有Python2中才有經典類
菱形繼承問題
如果繼承關系為菱形結構,即子類的父類最后繼承了同一個類,那么屬性的查找方式有兩種:
- 經典類下:深度優先
- 新式類下:廣度優先
- 經典類:一條路走到黑,深度優先
mro()方法
用來查看類的繼承順序
print(A.mro())
遵循如下三條准則:
子類會先於父類被檢查
多個父類會根據它們在列表中的順序被檢查
如果對下一個類存在兩個合法的選擇,選擇第一個父類
類的多態與多態性
多態
多態指的是一類事物有多種形態,(一個抽象類有多個子類,因而多態的概念依賴於繼承)
多態性
多態性是指具有不同功能的函數可以使用相同的函數名,這樣就可以用一個函數名調用不同內容的函數。
多態性的好處
增加了程序的靈活性:以不變應萬變,不論對象千變萬化,使用者都是同一種形式去調用,如func(animal)
增加了程序額可擴展性:通過繼承Animal類創建了一個新的類,使用者無需更改自己的代碼,還是用func(animal)去調用