這篇文章主要講解了“python的組合與繼承舉例分析”,文中的講解內(nèi)容簡單清晰,易于學習與理解,下面請大家跟著小編的思路慢慢深入,一起來研究和學習“python的組合與繼承舉例分析”吧!
創(chuàng)新互聯(lián)建站是一家專業(yè)提供東山企業(yè)網(wǎng)站建設,專注與網(wǎng)站設計制作、成都網(wǎng)站建設、H5場景定制、小程序制作等業(yè)務。10年已為東山眾多企業(yè)、政府機構(gòu)等服務。創(chuàng)新互聯(lián)專業(yè)網(wǎng)站設計公司優(yōu)惠進行中。
面向?qū)ο缶幊檀a復用的方式除了繼承還有組合,組合是指在一個類中有一部分數(shù)據(jù)是其他類的實例(對象)。
案例:
有二個類,分別是圓形、圓環(huán),用組合的方式寫。
以下是圓形類:
class Circle:pi = 3.14159265358979def __init__(self, r) -> None:self.r = r @propertydef area(self):return self.pi*self.r**2@propertydef perimeter(self):return self.pi*self.r*2
以下是圓環(huán)類:
class Ring:def __init__(self, inner, outer):inner, outer = (inner, outer) if inner < outer else (outer, inner)self.inner = Circle(inner)self.outer = Circle(outer)@propertydef area(self):return self.outer.area-self.inner.area @propertydef perimeter(self):return self.outer.perimeter+self.inner.perimeter
注意:
圓環(huán)類的init函數(shù),它的參數(shù)inner和outer是圓的半徑,代碼塊中首先判斷inner和outer兩個參數(shù)的大小,確保大的賦值給outer、小的賦值給inner,然后用inner和outer作參數(shù)分別調(diào)用Circle類創(chuàng)建inner實例和outer實例。因此創(chuàng)建Ring類的實例中會有2個屬性是Circle類的實例。
area方法和perimeter方法中都是調(diào)用了Circle中的對應方法進行計算。
總結(jié):
組合的方式可以提高代碼復用率,將來遇到需求變更(例如更改pi的精度,只要求小數(shù)點后2位)時只需要改動少量代碼,減少了出錯的概率,提高了代碼的可維護性。
繼承是一種定義類的方式,子類可以通過繼承來復用父類的數(shù)據(jù)和代碼塊。
子類中有一項非常重要的隱藏數(shù)據(jù)——類指針,訪問子類.變量(變量指向數(shù)據(jù)是它就是屬性、指向代碼塊時它就是方法)的時候如果子類中無此變量時,解釋器會通過類指針訪問其父類,若父類中也無此變量時會繼續(xù)向上訪問祖父類,若一直訪問到所有類的祖宗object類(在python中所有的類都繼承自object類)時仍然找不到這個變量時,解釋器就會報錯。注意:類指針是單向的!意思就是子類可以訪問父類的變量,而父類不能訪問子類的變量。
另外:python支持多繼承,而java只支持單繼承。
補充:學習繼承最重要的一點是搞清楚類指針、不同類的命名空間以及實例的命名空間創(chuàng)建、查找變量的過程,想要學明白的朋友最好是多閱讀代碼自己畫一下內(nèi)存示意圖。
案例:
class Animal:kind = '動物'def __init__(self, name):self.name = namedef eat(self):print(f'{self.name}正在進食!')class Cat(Animal):def __init__(self, name, count=0):self.count = count Animal.__init__(self, name)def mousing(self):print(f'貓咪“{self.name}”捉住了{self.count}只老鼠')white_cat = Cat('大白貓')white_cat.count += 1white_cat.mousing()white_cat.eat()print(white_cat.kind)out:貓咪“大白貓”捉住了1只老鼠 大白貓正在進食! 動物
講解:
以上是一個關(guān)于繼承的簡單案例,接下來我通過這個案例詳細梳理一下:
首先定義父類,父類是Animal,類體中有指向object類的類指針和kind屬性、__init__方法和eat方法,這些是所有動物的通用屬性和方法。寫代碼時父類代碼要放在子類代碼前面。
然后定義子類,定義子類Cat時將父類Animal當作參數(shù),這就是子類繼承了父類。類體中有指向Animal類的類指針、__init__方法和mousing方法,在__init__方法中初始化了count屬性(抓到老鼠的數(shù)量),其余的屬性則調(diào)用父類的__init__方法初始化。
接下來創(chuàng)建實例大白貓,創(chuàng)建實例時首先開辟一塊命名空間,在這塊內(nèi)存空間中創(chuàng)建一個指向Cat類的類指針,然后將該內(nèi)存空間的地址(該地址的名字叫self)傳給Cat類的__init__方法,再創(chuàng)建了self.count屬性,接下來調(diào)用父類的__init__方法創(chuàng)建了self.name屬性。所以實例“大白貓”的命名空間中有:指向Cat類的類指針、name屬性、count屬性。
注意:實例的屬性各不相同,所以屬性都放在實例自己的命名空間中。一個類的所有實例調(diào)用的方法都一樣,所以實例的方法都放在它們所屬類的命名空間中!
感謝各位的閱讀,以上就是“python的組合與繼承舉例分析”的內(nèi)容了,經(jīng)過本文的學習后,相信大家對python的組合與繼承舉例分析這一問題有了更深刻的體會,具體使用情況還需要大家實踐驗證。這里是創(chuàng)新互聯(lián),小編將為大家推送更多相關(guān)知識點的文章,歡迎關(guān)注!
本文標題:python的組合與繼承舉例分析
網(wǎng)頁URL:http://www.rwnh.cn/article12/gsphdc.html
成都網(wǎng)站建設公司_創(chuàng)新互聯(lián),為您提供網(wǎng)站制作、服務器托管、定制開發(fā)、外貿(mào)網(wǎng)站建設、網(wǎng)站排名、關(guān)鍵詞優(yōu)化
聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請盡快告知,我們將會在第一時間刪除。文章觀點不代表本網(wǎng)站立場,如需處理請聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時需注明來源: 創(chuàng)新互聯(lián)