Python類的封裝、繼承、多態(tài)3大特性,前面章節(jié)已經(jīng)詳細(xì)介紹了Python類的封裝,本節(jié)繼續(xù)講解Python類的繼承機制。 繼承機制經(jīng)常用于創(chuàng)建和現(xiàn)有類功能類似的新類,又或是新類只需要在現(xiàn)有類基礎(chǔ)上添加一些成員(屬性和方法),但又不想直接將現(xiàn)有類代碼復(fù)制給新類。也就是說,通過使用繼承這種機制,可以輕松實現(xiàn)類的重復(fù)使用。 舉個例子,假設(shè)現(xiàn)有一個Shape類,該類的draw()方法可以在屏幕上畫出指定的形狀,現(xiàn)在需要創(chuàng)建一個Form類,要求此類不但可以在屏幕上畫出指定的形狀,還可以計算出所畫形狀的面積。要創(chuàng)建這樣的類,笨方法是將draw()方法直接復(fù)制到新類中,并添加計算面積的方法。實現(xiàn)代碼如下所示: class Shape: def draw(self,content): print("畫",content)class Form: def draw(self,content): print("畫",content) def area(self): #.... print("此圖形的面積為...")123456789復(fù)制代碼類型:[python] 當(dāng)然還有更簡單的方法,就是使用類的繼承機制。實現(xiàn)方法為:讓From類繼承Shape類,這樣當(dāng)From類對象調(diào)用draw()方法時,Python解釋器會先去From中找以draw為名的方法,如果找不到,它還會自動去Shape類中找。如此,我們只需在From類中添加計算面積的方法即可,示例代碼如下: class Shape: def draw(self,content): print("畫",content)class Form(Shape): def area(self): #.... print("此圖形的面積為...")1234567復(fù)制代碼類型:[python] 上面代碼中,classFrom(Shape)就表示From繼承Shape。 Python中,實現(xiàn)繼承的類稱為子類,被繼承的類稱為父類(也可稱為基類、超類)。因此在上面這個樣例中,F(xiàn)rom是子類,Shape是父類。 子類繼承父類時,只需在定義子類時,將父類(可以是多個)放在子類之后的圓括號里即可。語法格式如下: class 類名(父類1, 父類2, ...): #類定義部分12復(fù)制代碼類型:[python] 注意,如果該類沒有顯式指定繼承自哪個類,則默認(rèn)繼承object類(object類是Python中所有類的父類,即要么是直接父類,要么是間接父類)。另外,Python的繼承是多繼承機制(和C++一樣),即一個子類可以同時擁有多個直接父類。 注意,有讀者可能還聽說過“派生”這個詞匯,它和繼承是一個意思,只是觀察角度不同而已。換句話話,繼承是相對子類來說的,即子類繼承自父類;而派生是相對于父類來說的,即父類派生出子類。 了解了繼承機制的含義和語法之后,下面代碼演示了繼承機制的用法: class People: def say(self): print("我是一個人,名字是:",self.name)class Animal: def display(self): print("人也是高級動物")#同時繼承 People 和 Animal 類#其同時擁有 name 屬性、say() 和 display() 方法class Person(People, Animal): passzhangsan = Person() zhangsan.name = "張三"zhangsan.say() zhangsan.display()1234567891011121314復(fù)制代碼類型:[python] 運行結(jié)果,結(jié)果為: 我是一個人,名字是: 張三 人也是高級動物12復(fù)制代碼類型:[python] 可以看到,雖然Person類為空類,但由于其繼承自People和Animal這2個類,因此實際上Person并不空,它同時擁有這2個類所有的屬性和方法。 沒錯,子類擁有父類所有的屬性和方法,即便該屬性或方法是私有(private)的。 關(guān)于Python的多繼承 事實上,大部分面向?qū)ο蟮木幊陶Z言,都只支持單繼承,即子類有且只能有一個父類。而Python卻支持多繼承(C++也支持多繼承)。 和單繼承相比,多繼承容易讓代碼邏輯復(fù)雜、思路混亂,一直備受爭議,中小型項目中較少使用,后來的Java、C#、PHP等干脆取消了多繼承。 使用多繼承經(jīng)常需要面臨的問題是,多個父類中包含同名的類方法。對于這種情況,Python的處置措施是:根據(jù)子類繼承多個父類時這些父類的前后次序決定,即排在前面父類中的類方法會覆蓋排在后面父類中的同名類方法。 舉個例子: class People: def __init__(self): self.name = People def say(self): print("People類",self.name)class Animal: def __init__(self): self.name = Animal def say(self): print("Animal類",self.name)#People中的 name 屬性和 say() 會遮蔽 Animal 類中的class Person(People, Animal): passzhangsan = Person() zhangsan.name = "張三"zhangsan.say()12345678910111213141516復(fù)制代碼類型:[python] 程序運行結(jié)果為: People類 張三1復(fù)制代碼類型:[python] 可以看到,當(dāng)Person同時繼承People類和Animal類時,People類在前,因此如果People和Animal擁有同名的類方法,實際調(diào)用的是People類中的。 雖然Python在語法上支持多繼承,但逼不得已,建議大家不要使用多繼承。 |
|