更新於 2024/01/22閱讀時間約 7 分鐘

[Python基礎]類別繼承(Inheritance)

[Python基礎]淺談類別

先前淺談了類別的用法,這次要在來研究一下類別繼承的概念。

延續蛋糕的案例的概念,同樣為食物,所以可以由食物當作父類別來延伸,蛋糕則是食物的子類別,若同樣為食物一定有相同的方法(函式)是固定的跟名字(屬性),可以讓子類別(蛋糕)繼承沿用,然後也有其他子類別也可以繼承這些方法名字,例如麵食或麵包

我們畫一張圖,來理理這之間的關係,先有個草圖的概念,我們在用後面的程式範例來解說。

類別繼承圖

程式範例

同樣都繼承了,屬性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)中的核心概念之一,重點:

  1. 基本概念:
    • 繼承允許一個類別子類別)從另一個類別(父類別繼承屬性和方法
    • 父類別是被繼承的類別,子類別是進行繼承的類別。
  2. 類別層次結構:
    • 通過繼承,可以建立一個類別的層次結構,形成父子關係。
  3. 程式碼重用:
    • 子類別可以繼承父類別的屬性和方法,實現程式碼重用。
  4. 覆寫和擴展:
    • 子類別可以覆寫父類別中的方法,提供自己的實現。
    • 子類別還可以擴展父類別方法,增加額外的功能。
  5. 清晰結構:
    • 繼承有助於組織代碼結構,形成清晰的層次結構,使代碼更易於理解和維護。


一天多了解一點,持續精進就會讓自己更強


分享至
成為作者繼續創作的動力吧!
© 2024 vocus All rights reserved.