日期:2020年2月9日
作者:Commas
註釋:學習就是爲了忘記,繼承是一種延續……
如果您想了解更多有關Python的知識,那麼請點《我的Python淺談系列目錄》
一、繼承的概念和語法
繼承
是面向對象中三大特性之一,可以讓子類擁有父類的屬性和方法;另外在子類中,還可以重新定義或修改屬性和方法。
# Python3之類繼承的語法:
class 類名(父類名):
pass
舉個例子,“廣東人”類繼承自“中國人”類,那麼“廣東人”類將擁有“中國人”類的屬性和方法,如下:
class Chinese:
"""中國人的類"""
language = "Mandarin"
def __init__(self, name, sex="male"):
self.name = name
self.sex = sex
def say_hello(self):
"""中國式打招呼"""
print("{}:吃了飯沒呀?".format(self.name))
class Cantonese(Chinese):
"""廣東人類,繼承中國人類"""
pass
# 實例一個廣東老許
xu = Cantonese("老許")
# 屬性
print(xu.language)
print(xu.name)
print(xu.sex)
# 方法調用
xu.say_hello()
# 控制檯輸出:
Mandarin
老許
male
老許:吃了飯沒呀?
知識加油站:
Cantonese類是從Chinese類繼承(派生)
,所以Cantonese類是Chinese類的子類(派生類)
,Chinese類是Cantonese類的父類(基類)
;
二、方法的重寫與super()的調用
廣東人打招呼比較喜歡用廣東話,所以我們需要重寫一下打招呼的方法,如下:
class Cantonese(Chinese):
"""廣東人類,繼承中國人類"""
def say_hello(self):
"""重寫方法,廣東人打招呼"""
print("{}:食咗飯未呀?".format(self.name))
# 實例一個廣東老許
xu = Cantonese("老許")
# 屬性
print(xu.language)
print(xu.name)
print(xu.sex)
# 方法調用
xu.say_hello()
# 控制檯輸出:
Mandarin
老許
male
老許:食咗飯未呀?
可能另外一個人聽不懂廣東話,那麼就需要使用“中國人”類中的打招呼,我們無需重寫,只需要使用super()
來調用父類的打招呼方法即可,如下:
class Cantonese(Chinese):
"""廣東人類,繼承中國人類"""
def say_hello(self):
"""重寫方法,廣東人打招呼"""
print("{}:食咗飯未呀?".format(self.name))
# 可能廣東話聽不懂,所以需要調用父類的普通話再問候一遍
super().say_hello()
xu = Cantonese("老許")
# 屬性
print(xu.language)
print(xu.name)
print(xu.sex)
# 方法調用
xu.say_hello()
# 控制檯輸出:
Mandarin
老許
male
老許:食咗飯未呀?
老許:吃了飯沒呀?
小結:
方法的重寫,又是一次“就近原則”
的運用。發現子類有say_hello()方法,就使用子類的該方法;若未發現,則使用父類的方法,總之一直往上找,沒有就拋出異常。這個解釋,也可以從類中的一個內置屬性__mro__(method resolution order,即方法搜索順序)得到證實,如下:
print(Cantonese5.__mro__)
控制檯輸出:
(<class '__main__.Cantonese'>, <class '__main__.Chinese'>, <class 'object'>)
三、單繼承與多繼承
類型 | 語法 | 說明 |
---|---|---|
單繼承 | class 類名(父類名):pass | 子類擁有父類的屬性和方法 |
多繼承 | class 類名(父類名1,父類名2,…):pass | 子類擁有所有父類的屬性和方法 |
值得指出的是,在多繼承中,如果有父類的屬性名或方法名相同的時候,還是會按照“就近原則”
進行處理,即先找本身,再從左往右依次尋找各個父類(父類名1,父類名2,…),直至找到爲止,如果所有都搜索完仍未找到,那麼就拋出異常。
版權聲明:本文爲博主原創文章,如需轉載,請給出:
原文鏈接:https://blog.csdn.net/qq_35844043/article/details/104245600