聊完了多態,再來看看面向對象的另一個特征:繼承性。
什么是繼承?繼承就是定義好了一個類A(父類);再定義一個新類B(子類),類B擁有類A的方法和屬性,并且又定義了新的屬性和方法。類A稱為父類,類B稱為子類。
java中定義兩個類的繼承關系,使用extends關鍵字實現,在python中呢?
classFather:
"""這是一個父類"""
__age=45
classSon(Father):
"""這是一個子類"""
python中不需要加關鍵字來說明繼承關系,只需要將父類的名稱放在括號中就可以了,看起來要比java簡潔一些。
父類和子類的初始化函數調用
前面講過,pythonclass中可以定義自己的初始化函數,在實例化的時會被調用。那如果父類和子類都有初始化函數或者父類有而子類沒有,那初始化函數該如何執行呢?這里分為三種情況來說明,先來看第一種。
第一種情況,
父類有init而子類沒有,這時父類的初始化函數會被默認調用
classFather():
"""這是一個父類"""
def__init__(self,age):
print("Father'sinitfunctioninvoke")
self.__age=age
classSon(Father):
"""這是一個子類"""
son=Son(5)
這里要注意,父類中需要的age參數一定要傳進去哦,要不然會報錯的。
第二種情況
父類,子類都有init,而子類沒有顯式調用父類的init方法時,父類初始化函數是不會被調用的
classFather():
"""這是一個父類"""
def__init__(self,age):
print("Father'sinitfunctioninvoke")
self.__age=age
defget_age(self):
returnself.__age
classSon(Father):
"""這是一個子類"""
def__init__(self,age):
print("Son'sinitfunctioninvoke")
self.__age=age
son=Son(5)#Son'sinitfunctioninvoke
print(son.get_age())#AttributeError:'Son'objecthasnoattribute'_Father__age'
細心的同學會發現,代碼中的最后一句報錯了,表示Son對象沒有Father類的__age變量。這是因為
父類的初始化函數沒有執行,父類的__age變量則沒有初始化
get_age函數是被子類從父類繼承來的,返回的是父類的__age變量
那我要是想解決這個錯誤,該怎么做呢?有兩種方法
在子類Son的初始化函數中顯式調用父類Father的初始化函數
在子類Son中重新定義個get_age方法,這樣就會覆蓋父類的同名方法,返回的是子類的_age變量
第二種方法就不貼代碼了,感興趣的話可以試試。重點來看第一種方法,這就引出了第3種情況。
第三種情況
子類在自己定義的init方法中,顯式調用父類的init方法,父類和子類的屬性都會被初始化
classFather():
"""這是一個父類"""
def__init__(self,age):
print("Father'sinitfunctioninvoke")
self.__age=age
defget_age(self):
returnself.__age
classSon(Father):
"""這是一個子類"""
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
看到代碼中是怎么調用父類的初始化函數嗎?對,用的是super。
java中也有super關鍵字,表示對父類的指代,python的super是怎么用的,原理是什么?我們來看下。
super有哪些用法?
下面說明的只針對python單繼承的情況,多繼承這里暫不涉及,有興趣的同學可以自行充電。
在單繼承中,super也可以看做對其父類的指代,它的使用場合就是用來調用父類的方法:
調用父類的__init__方法
實現了和父類相同的功能,還需要調用父類的方法
它的寫法是super(Son,self).xxx,當然也可以寫成super()這種簡寫的形式。
來看代碼
classFather():
"""這是一個父類"""
def__init__(self,age):
print("Father'sinitfunctioninvoke")
self.__age=age
defget_age(self):
returnself.__age
classSon(Father):
"""這是一個子類"""
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
通過代碼來窺探下它的執行原理,以super(Son,self).get_age()為例
self是Son的一個實例,super把self轉化為父類Father的一個實例對象
因為self經過了轉化,那它得到的__age,也是父類初始化時得到的__age
以上內容為大家介紹了Python繼承性和java是一樣的嗎?,希望對大家有所幫助,如果想要了解更多Python相關知識,請關注IT培訓機構:千鋒教育。http://www.dietsnews.net/