想必在寫程式的過程中,大家或多或少都有聽過所謂物件導向 (Object Oriented Programming) 的觀念,也就是所謂的 OOP,甚至在業界內流傳著"想提早下班,請學好 OOP",接下來的文章會記錄著筆者學習設計模式的心路歷程,如果在觀念上有錯或是有甚麼問題想討論的,都歡迎留言討論
另外每篇文章使用到的 code 都會同步推上筆者的 GitHub 歡迎大家取用參考
在開始講設計模式之前,我們先來認識一下類別以及 OOP 的觀念,OOP 最大的三個核心觀念就是 "封裝"、"繼承"、"多型",下面我們會先從甚麼是類別開始依序介紹
類別其實是直接從他的英文 class 直接翻譯過來的,因此與其稱呼她為類別,不如直接叫他物件,也就是物件導向中的物件本人,下面就讓我們看看在 Python 中怎麼要建立一個物件
class House:
floor: int
color: str
def __init__(self, floor: int, color: str):
self.floor = floor
self.color = color
def __str__(self):
return f"這是個樓高 {self.floor} 層,顏色為 {self.color} 的房子"
house = House(floor=10, color="red")
print(house)
上面的程式當中可以分三塊進行解釋
屬性部分:
可以看到在 House 這個物件當中我們設定了兩個屬性,分別為 floor 和 color
__init__
部分:
這個部分用來控制,當今天我們在實體化這個物件的時候,我們需要傳入甚麼樣的參數來建立,並且做一些預處理,此處單純將傳入的 floor 以及 color 設定給物件自身
__str__
部分:
這個部份用來控制,當今天使用 print 印出這個物件的時候,會印出什麼,是 python 內的寫法
下圖為執行上述程式後終端機的結果
若 B 類別繼承了 A 類別,則稱 A 類別為 B 的父類別,B 為 A 的子類別,而子類別會擁有父類別所擁有的 function 以及 attribute (私有性質的除外),也可以改寫父類別的 function,而在 python 當中想要繼承某個類別,則只需要在新建立的類別後面用括號加上想繼承的父類別名稱即可,下方付上範例
class BaseHouse:
floor: int
color: str
def __init__(self, floor: int, color: str):
self.floor = floor
self.color = color
def __str__(self):
return f"這是個樓高 {self.floor} 層,顏色為 {self.color} 的房子"
class Apartment(BaseHouse):
def __str__(self):
return f"這是一個樓高 {self.floor} 層的公寓,顏色為 {self.color}"
class Skyscraper(BaseHouse):
def __str__(self):
return f"這是一個樓高 {self.floor} 層的摩天大樓,顏色為 {self.color}"
apartment = Apartment(floor=10, color="red")
skyscraper = Skyscraper(floor=101, color="green")
print(apartment)
print(skyscraper)
上方的程式當中我們可以看到,筆者先建立一個 BaseHouse 作為房子的基本類別,並於下方建立 Apartment 以及 Skyscraper 兩個類別且繼承 BaseHouse,這樣我們可以確保繼承 BaseHouse 的類別都會有 color 以及 floor 這兩個屬性,並於兩個子類別中修改 __str__
中回傳的內容
下圖為執行結果