先前淺談了類別的用法,這次要在來研究一下類別繼承的概念。
延續蛋糕的案例的概念,同樣為食物,所以可以由食物當作父類別來延伸,蛋糕則是食物的子類別,若同樣為食物一定有相同的方法(函式)是固定的跟名字(屬性),可以讓子類別(蛋糕)來繼承沿用,然後也有其他子類別也可以繼承這些方法跟名字,例如麵食或麵包。
我們畫一張圖,來理理這之間的關係,先有個草圖的概念,我們在用後面的程式範例來解說。
同樣都繼承了,屬性self.name = name
,方法describe
,只是子類別可以改寫其方法跟屬性。
class Food:
def __init__(self, name):
self.name = name
def describe(self):
return f"這是一個{self.name}."
class Bread(Food):
def __init__(self, name, bread_type):
super().__init__(name)
self.bread_type = bread_type
def describe(self):
return f"這是一個 {self.name} 屬於 {self.bread_type} 類型."
class Cake(Food):
def __init__(self, name, flavor):
super().__init__(name)
self.flavor = flavor
def describe(self):
return f"這是一個 {self.name} 口味是 {self.flavor} 口味."
class Noodle(Food):
def __init__(self, name, noodle_type):
super().__init__(name)
self.noodle_type = noodle_type
def describe(self):
return f"這是一個 {self.name} 口味是 {self.noodle_type} 麵食."
Wheat_bread = Bread("麵包", "全麥")
Chocolate_cake = Cake("蛋糕", "巧克力")
Ramen_noodle = Noodle("麵食", "拉麵")
print(Wheat_bread.describe()) # 這是一個 麵包 屬於 全麥 類型.
print(Chocolate_cake.describe()) # 這是一個 蛋糕 口味是 巧克力 口味.
print(Ramen_noodle.describe()) # 這是一個 麵食 口味是 拉麵 麵食.
這樣以上的範例,看不出來繼承有什麼優點,好像也沒少打幾行程式碼,讓我們試著擴展這個例子,以更明顯地展示類別繼承的一些優勢。
我們先來考慮以下情境:每種食物都有價格,並且可以進行烹飪。我們將引入新的概念來處理這些方面。
在父類別新增self.price = price
這個屬性及cook
這個方法,讓子類別繼承使用。
class Food:
def __init__(self, name, price):
self.name = name
self.price = price
def describe(self):
return f"這是一個{self.name}."
def cook(self):
return f"正在烹飪 {self.name}."
class Bread(Food):
def __init__(self, name, bread_type,price):
super().__init__(name,price)
self.bread_type = bread_type
def describe(self):
return f"這是一個 {self.name} 屬於 {self.bread_type} 類型."
class Cake(Food):
def __init__(self, name, flavor,price):
super().__init__(name, price)
self.flavor = flavor
def describe(self):
return f"這是一個 {self.name} 口味是 {self.flavor} 口味."
class Noodle(Food):
def __init__(self, name, noodle_type,price):
super().__init__(name,price)
self.noodle_type = noodle_type
def describe(self):
return f"這是一個 {self.name} 口味是 {self.noodle_type} 麵食."
Wheat_bread = Bread("麵包", "全麥", 50)
Chocolate_cake = Cake("蛋糕", "巧克力", 100)
Ramen_noodle = Noodle("麵食", "拉麵", 150)
print(Wheat_bread.describe()) # 這是一個 麵包 屬於 全麥 類型.
print(Chocolate_cake.describe()) # 這是一個 蛋糕 口味是 巧克力 口味.
print(Ramen_noodle.describe()) # 這是一個 麵食 口味是 拉麵 麵食.
print(Wheat_bread.cook()) #正在烹飪 麵包.
print(Chocolate_cake.cook())#正在烹飪 蛋糕.
print(Ramen_noodle.cook())#正在烹飪 麵食.
這樣,透過繼承,我們可以更容易地管理不同食物的共享特徵(共享方法),同時保持結構的清晰性。在真實的應用中,這種設計有助於代碼的擴展和維護。
繼承是物件導向程式設計(OOP)中的核心概念之一,重點: