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