繼承使我們能夠定義一個(gè)繼承父類所有功能的類,并允許我們添加更多功能。 在本文中,您將學(xué)習(xí)在Python中使用繼承。
繼承是面向?qū)ο缶幊讨械囊豁?xiàng)強(qiáng)大功能。
它指的是定義一個(gè)新類,而對現(xiàn)有類的進(jìn)行很少修改或沒有修改。新類稱為派生(或子)類,而從其繼承的新類稱為基(或父)類。
class BaseClass: #基類主體 class DerivedClass(BaseClass): #派生類的主體
派生類從基類繼承要素,并向其添加新要素。這可以提高代碼的可重用性。
為了演示繼承的使用,讓我們舉一個(gè)示例。
多邊形是具有3個(gè)或更多邊的閉合圖形。說,我們有一個(gè)名為的類,Polygon定義如下。
class Polygon: def __init__(self, no_of_sides): self.n = no_of_sides self.sides = [0 for i in range(no_of_sides)] def inputSides(self): self.sides = [float(input("輸入邊長 "+str(i+1)+" : ")) for i in range(self.n)] def dispSides(self): for i in range(self.n): print("邊長",i+1,"是",self.sides[i])
此類具有數(shù)據(jù)屬性,用于存儲(chǔ)邊數(shù),邊數(shù)和每邊的大小作為列表,即邊數(shù)。
方法inputSides()取每一側(cè)的大小,類似地,dispSides()將它們正確顯示。
三角形是具有3個(gè)邊的多邊形。因此,我們可以創(chuàng)建一個(gè)名為的類,該類Triangle繼承自Polygon。這使得類中所有可用的屬性都可以在中Polygon輕松使用Triangle。我們不需要再次定義它們(代碼可重用性)。Triangle定義如下。
class Triangle(Polygon): def __init__(self): Polygon.__init__(self,3) def findArea(self): a, b, c = self.sides # 計(jì)算半周長 s = (a + b + c) / 2 area = (s*(s-a)*(s-b)*(s-c)) ** 0.5 print('三角形的面積是 %0.2f' %area)
但是,class Triangle具有一種新方法findArea()來查找和打印三角形的區(qū)域。這是一個(gè)示例運(yùn)行。
>>> t = Triangle() >>> t.inputSides() 輸入邊長 1 : 3 輸入邊長 2 : 5 輸入邊長 3 : 4 >>> t.dispSides() 邊長 1 是 3.0 邊長 2 是 5.0 邊長 3 是 4.0 >>> t.findArea() 三角形的面積是 6.00
我們可以看到,盡管我們沒有為類Triangle定義inputSides()或sides()之類的方法,但是我們能夠使用它們。
如果在類中找不到屬性,則搜索繼續(xù)到基類。如果基類本身是從其他類派生的,則將以遞歸方式重復(fù)此操作。
在上面的示例中,請注意,在Triangle和Polygon這兩個(gè)類中都定義了__init __()方法。 發(fā)生這種情況時(shí),派生類中的方法將覆蓋基類中的方法。 也就是說,Triangle中的__init __()優(yōu)先于Polygon中的__init __()。
通常,當(dāng)覆蓋基本方法時(shí),我們傾向于擴(kuò)展定義而不是簡單地替換它。 通過從派生類中的基類中調(diào)用基類中的方法(從Triangle中的__init __()中調(diào)用Polygon .__ init __())來完成相同的操作。
更好的選擇是使用內(nèi)置函數(shù)super()。因此,super().__init__(3)等效于Polygon.__init__(self,3)并且是首選。您可以了解有關(guān)Python中的super()函數(shù)的更多信息。
兩個(gè)內(nèi)置函數(shù)isinstance(),issubclass()用于檢查繼承。如果對象是該類或從其派生的其他類的示例,則函數(shù)isinstance()返回True。Python中的每個(gè)類都繼承自基類object。
>>> isinstance(t,Triangle) True >>> isinstance(t,Polygon) True >>> isinstance(t,int) False >>> isinstance(t,object) True
同樣,issubclass()用于檢查類的繼承。
>>> issubclass(Polygon,Triangle) False >>> issubclass(Triangle,Polygon) True >>> issubclass(bool,int) True