Python3之類的繼承

日期: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

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章