Python - 繼承

Python中的繼承是什麼?

繼承是面向對象編程(OOP)中的基本概念,它允許一個類繼承另一個類的屬性和方法。這可以實現代碼的重用性和模塊化,因為您可以在不需要重複撰寫相同代碼的情況下,基於現有類創建新類。在Python中,繼承是通過使用class關鍵字後跟父類名稱的括號來實現的。

Python - Inheritance

創建父類

讓我們從創建一個名為Animal的簡單父類開始:

class Animal:
def __init__(self, name):
self.name = name

def speak(self):
raise NotImplementedError("子類必須實現此方法")

在這個例子中,我們定義了一個Animal類,其中有一個__init__方法用於初始化name屬性,以及一個speak方法,當子類沒有提供自己的speak方法實現時,它會引發NotImplementedError

創建子類

現在,讓我們創建一個名為Dog的子類,從Animal類繼承:

class Dog(Animal):
def speak(self):
return f"{self.name}說Woof!"

Dog類繼承了Animal類的所有屬性和方法,但它提供了自己的speak方法實現。當我們創建Dog類的實例並調用其speak方法時,它將返回"[狗的名字]說Woof!"而不是引發錯誤。

my_dog = Dog("Buddy")
print(my_dog.speak())  # 輸出:Buddy說Woof!

繼承的類型

Python中有三種繼承類型:單繼承、多繼承、多級繼承和分層繼承。我們將詳細探討每一種類型。

Python - 單繼承

單繼承是最常見的繼承形式,其中一個類只繼承一個父類。如我們上面所見,Dog類繼承自Animal類,這就是單繼承的例子。

Python - 多繼承

多繼承是指一個類繼承多個父類。然而,Python並不直接通過類定義語法支持多繼承。相反,它使用一種稱為"mixins"或"接口"的技術來實現多繼承。

方法解析順序(MRO)

Python使用C3線性化算法來確定在查找方法時搜索基礎類的順序。MRO確保每個類在方法解析順序中最多出現一次,並且維護了在類定義中指定基礎類的順序。

Python - 多級繼承

多級繼承發生在一個類繼承自子類,形成類的層次結構時。這裡有一個例子:

class Mammal(Animal):
pass

class Cat(Mammal):
def speak(self):
return f"{self.name}說Meow!"

在這種情況下,Cat類繼承自Mammal類,而Mammal類則繼承自Animal類。這形成了多級繼承層次結構。

Python - 分層繼承

分層繼承涉及多個子類繼承自單個超類。例如:

class Reptile(Animal):
pass

class Snake(Reptile):
def speak(self):
return f"{self.name}說Hiss!"

class Lizard(Reptile):
def speak(self):
return f"{self.name}說Crawl!"

在這種情況下,SnakeLizard類都繼承自Reptile類,而Reptile類則繼承自Animal類。這形成了分層繼承結構。

Python - 混合繼承

混合繼承結合了多繼承和其他類型繼承的特點。它在Python中不直接支持,但可以通過使用mixins或結合不同類型的繼承來實現。

super()函數

super()函數用於在子類中調用父類的方法。當您想要擴展或覆蓋父類的方法,同时仍然保留其部分功能時,它特別有用。這裡有一個例子:

class Bird(Animal):
def __init__(self, name, wingspan):
super().__init__(name)
self.wingspan = wingspan

def speak(self):
return f"{self.name}說Chirp!"

在這種情況下,Bird類繼承自Animal類,並使用super()函數調用父類的__init__方法。這確保了name屬性能夠正確初始化。此外,Bird類提供了自己的speak方法實現。

my_bird = Bird("Tweety", 10)
print(my_bird.speak())  # 輸出:Tweety說Chirp!

通過使用繼承,您可以創建更專門化的類,它們繼承並擴展父類的功能,促進代碼的重用性和組織。請記住,繼承只是OOP的一個方面,還有其他概念如多態性、封裝和抽象也在設計健壯且可維護的軟件系統中扮演著重要的角色。

Credits: Image by storyset