python類的繼承
類的繼承,跟人類繁衍的關(guān)系相似。
被繼承的類稱為基類(也叫做父類),繼承而得的類叫派生類(也叫子類),這種關(guān)系就像人類的父子關(guān)系。
繼承最大的好處是子類獲得了父類的全部變量和方法的同時(shí),又可以根據(jù)需要進(jìn)行修改、拓展。
繼承的語(yǔ)法結(jié)構(gòu)是
class 子類(父類):
1. 單繼承
舉個(gè)例子:下面的代碼中。先是定義了一個(gè) People 類,里面有一個(gè) speak 方法。然后再定義一個(gè) Student 類,并繼承自 People 類。
# 父類定義
class People:
def __init__(self, name, age, weight):
self.name = name
self.age = age
def speak(self):
print(f"{self.name} 說(shuō): 我{self.age}歲。")
# 單繼承示例
class Student(People):
def __init__(self, name, age, weight, grade):
# 調(diào)用父類的實(shí)例化方法
People.__init__(self, name, age, weight)
self.grade = grade
由于繼承的機(jī)制,Student 實(shí)例會(huì)擁有 People 類所有屬性和方法,比如下邊我可以直接調(diào)用 People 類的 speak 方法。
>>> xm = Student(name="小明", age=10, weight=50, grade="三年級(jí)")
>>> xm.speak()
小明 說(shuō): 我 10 歲。
你如果不想使用父類的方法,你可以重寫它以覆蓋父類的 speak
方法。
# 單繼承示例
class Student(People):
def __init__(self, name, age, weight, grade):
# 調(diào)用父類的實(shí)例化方法
People.__init__(self, name, age, weight)
self.grade = grade
# 重寫父類的speak方法
def speak(self):
print(f"{self.name} 說(shuō): 我{self.age}歲了,我在讀{self.grade}")
此時(shí),再調(diào)用的話,就會(huì)調(diào)用自己的方法了
>>> xm = Student(name="小明", age=10, weight=50, grade="三年級(jí)")
>>> xm.speak()
小明 說(shuō): 我10歲了,我在讀三年級(jí)
2. 多繼承
Python 還支持多繼承,可以繼承自多個(gè)類。
class 子類(父類1, 父類2, 父類3...):
多繼承的話,情況會(huì)比單繼承復(fù)雜得多。
假設(shè)多個(gè)父類都有一個(gè) foo 方法,并且子類沒(méi)有重寫 foo 方法,那么 子類 的實(shí)例在調(diào)用 foo 方法時(shí),應(yīng)該使用哪個(gè)父類的 foo 方法呢?
關(guān)于這一點(diǎn),只要簡(jiǎn)單的做個(gè)驗(yàn)證就行啦。
有如下代碼,定義了 7 個(gè)類
class D:pass
class C(D):pass
class B(C):
def show(self):
print("i am B")
class G:pass
class F(G):pass
class E(F):
def show(self):
print("i am E")
class A(B, E):pass
運(yùn)行后的結(jié)果如下
>>> a = A()
>>> a.show()
i am B
在類A中,沒(méi)有show()這個(gè)方法,于是它只能去它的父類里查找,它首先在B類中找,結(jié)果找到了,于是直接執(zhí)行B類的show()方法。可見(jiàn),在A的定義中,繼承參數(shù)的書寫有先后順序,寫在前面的被優(yōu)先繼承。
3. 繼承順序
那如果B沒(méi)有show方法,而是D有呢?
class D:
def show(self):
print("i am D")
class C(D):pass
class B(C):pass
class G:pass
class F(G):pass
class E(F):
def show(self):
print("i am E")
class A(B, E):pass
執(zhí)行結(jié)果是
>>> a = A()
>>> a.show()
i am D
由此可見(jiàn),多繼承的順序使用的是從左向右再深度優(yōu)先的原則。
審核編輯:符乾江
-
python
+關(guān)注
關(guān)注
55文章
4768瀏覽量
84376 -
繼承
+關(guān)注
關(guān)注
0文章
10瀏覽量
2688
發(fā)布評(píng)論請(qǐng)先 登錄
相關(guān)推薦
評(píng)論