Python繼承性和 java 是一樣的嗎?
聊完了多態(tài),再來(lái)看看面向?qū)ο蟮牧硪粋€(gè)特征:繼承性。
什么是繼承?繼承就是定義好了一個(gè)類A(父類);再定義一個(gè)新類B(子類),類B擁有類A的方法和屬性,并且又定義了新的屬性和方法。類A稱為父類,類B稱為子類。
java中定義兩個(gè)類的繼承關(guān)系,使用extends關(guān)鍵字實(shí)現(xiàn),在python中呢?
classFather:
"""這是一個(gè)父類"""
__age=45
classSon(Father):
"""這是一個(gè)子類"""
python中不需要加關(guān)鍵字來(lái)說(shuō)明繼承關(guān)系,只需要將父類的名稱放在括號(hào)中就可以了,看起來(lái)要比java簡(jiǎn)潔一些。
父類和子類的初始化函數(shù)調(diào)用
前面講過(guò),pythonclass中可以定義自己的初始化函數(shù),在實(shí)例化的時(shí)會(huì)被調(diào)用。那如果父類和子類都有初始化函數(shù)或者父類有而子類沒(méi)有,那初始化函數(shù)該如何執(zhí)行呢?這里分為三種情況來(lái)說(shuō)明,先來(lái)看第一種。
第一種情況,
父類有init而子類沒(méi)有,這時(shí)父類的初始化函數(shù)會(huì)被默認(rèn)調(diào)用
classFather():
"""這是一個(gè)父類"""
def__init__(self,age):
print("Father'sinitfunctioninvoke")
self.__age=age
classSon(Father):
"""這是一個(gè)子類"""
son=Son(5)
這里要注意,父類中需要的age參數(shù)一定要傳進(jìn)去哦,要不然會(huì)報(bào)錯(cuò)的。
第二種情況
父類,子類都有init,而子類沒(méi)有顯式調(diào)用父類的init方法時(shí),父類初始化函數(shù)是不會(huì)被調(diào)用的
classFather():
"""這是一個(gè)父類"""
def__init__(self,age):
print("Father'sinitfunctioninvoke")
self.__age=age
defget_age(self):
returnself.__age
classSon(Father):
"""這是一個(gè)子類"""
def__init__(self,age):
print("Son'sinitfunctioninvoke")
self.__age=age
son=Son(5)#Son'sinitfunctioninvoke
print(son.get_age())#AttributeError:'Son'objecthasnoattribute'_Father__age'
細(xì)心的同學(xué)會(huì)發(fā)現(xiàn),代碼中的最后一句報(bào)錯(cuò)了,表示Son對(duì)象沒(méi)有Father類的__age變量。這是因?yàn)?/p>
父類的初始化函數(shù)沒(méi)有執(zhí)行,父類的__age變量則沒(méi)有初始化
get_age函數(shù)是被子類從父類繼承來(lái)的,返回的是父類的__age變量
那我要是想解決這個(gè)錯(cuò)誤,該怎么做呢?有兩種方法
在子類Son的初始化函數(shù)中顯式調(diào)用父類Father的初始化函數(shù)
在子類Son中重新定義個(gè)get_age方法,這樣就會(huì)覆蓋父類的同名方法,返回的是子類的_age變量
第二種方法就不貼代碼了,感興趣的話可以試試。重點(diǎn)來(lái)看第一種方法,這就引出了第3種情況。
第三種情況
子類在自己定義的init方法中,顯式調(diào)用父類的init方法,父類和子類的屬性都會(huì)被初始化
classFather():
"""這是一個(gè)父類"""
def__init__(self,age):
print("Father'sinitfunctioninvoke")
self.__age=age
defget_age(self):
returnself.__age
classSon(Father):
"""這是一個(gè)子類"""
def__init__(self,age):
print("Son'sinitfunctioninvoke")
self.__age=age
super(Son,self).__init__(age+25)
defget_age(self):
returnself.__age
defget_father_age(self):
returnsuper(Son,self).get_age()
son=Son(5)
#Son'sinitfunctioninvoke
#Father'sinitfunctioninvoke
print(son.get_father_age())#30
print(son.get_age())#5
看到代碼中是怎么調(diào)用父類的初始化函數(shù)嗎?對(duì),用的是super。
java中也有super關(guān)鍵字,表示對(duì)父類的指代,python的super是怎么用的,原理是什么?我們來(lái)看下。
super有哪些用法?
下面說(shuō)明的只針對(duì)python單繼承的情況,多繼承這里暫不涉及,有興趣的同學(xué)可以自行充電。
在單繼承中,super也可以看做對(duì)其父類的指代,它的使用場(chǎng)合就是用來(lái)調(diào)用父類的方法:
調(diào)用父類的__init__方法
實(shí)現(xiàn)了和父類相同的功能,還需要調(diào)用父類的方法
它的寫(xiě)法是super(Son,self).xxx,當(dāng)然也可以寫(xiě)成super()這種簡(jiǎn)寫(xiě)的形式。
來(lái)看代碼
classFather():
"""這是一個(gè)父類"""
def__init__(self,age):
print("Father'sinitfunctioninvoke")
self.__age=age
defget_age(self):
returnself.__age
classSon(Father):
"""這是一個(gè)子類"""
def__init__(self,age):
print("Son'sinitfunctioninvoke")
self.__age=age
super(Son,self).__init__(age+25)
defget_age(self):
returnself.__age
defget_father_age(self):
returnsuper(Son,self).get_age()
son=Son(5)
#Son'sinitfunctioninvoke
#Father'sinitfunctioninvoke
print(son.get_father_age())#30
print(son.get_age())#5
通過(guò)代碼來(lái)窺探下它的執(zhí)行原理,以super(Son,self).get_age()為例
self是Son的一個(gè)實(shí)例,super把self轉(zhuǎn)化為父類Father的一個(gè)實(shí)例對(duì)象
因?yàn)閟elf經(jīng)過(guò)了轉(zhuǎn)化,那它得到的__age,也是父類初始化時(shí)得到的__age
以上內(nèi)容為大家介紹了Python繼承性和java是一樣的嗎?,希望對(duì)大家有所幫助,如果想要了解更多Python相關(guān)知識(shí),請(qǐng)關(guān)注IT培訓(xùn)機(jī)構(gòu):千鋒教育。http://www.mobiletrain.org/

猜你喜歡LIKE
相關(guān)推薦HOT
更多>>
如何使用Pandas處理Excel?
如何使用Pandas處理Excel?做過(guò)行政或者人事,或者對(duì)此有過(guò)了解的小伙伴,一定對(duì)下發(fā)各個(gè)部分的表有著非常深刻的印象,最常見(jiàn)的就是需要我們將一...詳情>>
2023-11-14 07:43:15
python中np.insert()函數(shù)的使用方法
python中np.insert()函數(shù)的使用方法在numpy數(shù)組操作中,np.append()方法可以在每行每列的最后添加數(shù)據(jù),但其位置是規(guī)定的,那如果想要指定添加...詳情>>
2023-11-14 05:06:13
SVM在python中的原理如何理解?
SVM在python中的原理如何理解?在python中除了編程化的知識(shí)點(diǎn)外,對(duì)于數(shù)學(xué)方法的算法也有所涉及,SVM就是一種很好地體現(xiàn)。我們學(xué)習(xí)過(guò)數(shù)學(xué)中的坐...詳情>>
2023-11-14 04:30:04
python處理絕對(duì)路徑和相對(duì)路徑函數(shù)有哪些?
python處理絕對(duì)路徑和相對(duì)路徑函數(shù)有哪些?絕對(duì)路徑和相對(duì)路徑是什么?絕對(duì)路徑:從根文件夾開(kāi)始,Windows系統(tǒng)以盤(pán)符(C:)作為根文件夾,OSX或Lin...詳情>>
2023-11-14 03:33:02熱門(mén)推薦
如何使用python any()判斷多元素?
沸如何使用Pandas處理Excel?
熱python函數(shù)中的參數(shù)有哪些?
熱python中pygal模塊如何使用?
新Python的excel處理操作
python中doctest庫(kù)是什么?
python中series是什么意思
python中np.insert()函數(shù)的使用方法
SVM在python中的原理如何理解?
Python描述符中有哪三種方法?
python處理絕對(duì)路徑和相對(duì)路徑函數(shù)有哪些?
python單繼承和多繼承如何定義?
python封裝中的私有如何理解?
python模塊引入的三種方式
技術(shù)干貨







快速通道 更多>>
-
課程介紹
點(diǎn)擊獲取大綱 -
就業(yè)前景
查看就業(yè)薪資 -
學(xué)習(xí)費(fèi)用
了解課程價(jià)格 -
優(yōu)惠活動(dòng)
領(lǐng)取優(yōu)惠券 -
學(xué)習(xí)資源
領(lǐng)3000G教程 -
師資團(tuán)隊(duì)
了解師資團(tuán)隊(duì) -
實(shí)戰(zhàn)項(xiàng)目
獲取項(xiàng)目源碼 -
開(kāi)班地區(qū)
查看來(lái)校路線