繼承
當你試著解決一些程式設計的問題時,通常會發現有一個「既有的類別所建立的物件」已經大致滿足你的需求了。 你可以做什麼?
【解決方案一】
可以修改這個舊類別
- 缺點
- 這種做法會讓它變得更複雜
- 也有可能會破壞原本可以正常動作的功能
【解決方案二】
寫一個新類別(剪下舊的,貼到新的,合併到你的新程式)
- 缺點
- 代表需要維護更多程式
- 而且動作曾經一致的舊程式與新類別可能會漸行漸遠,因為現在它們分屬不同的程式段落
【解決方案三】
- 解決之道:使用繼承
- 使用「既有的類別」來建立一個「新的類別」,但加入一些新的東西,或修改它
- 這是一種很棒的程式重複使用方式
- 使用繼承時,「新類別」可以自動使用「舊類別的所有程式」,但不需要複製任何舊程式
- 可以只在新類別定義想要添加或改變的東西 → 它們會覆寫舊類別的行為
- 類別名稱
- 原本的類別稱為:父系(parent)、超類別(superclass)或基礎類別(base class)
- 新類別稱為:子系(child)、子類別(subclass)或衍生類別(derived class)
- 在物件導向程式設計中,這些名詞是可以互換的
【範例一】繼承
- 定義一個空類別
- 定義一個子類別 → 定義子類別一樣使用「class 關鍵字」,但要在括號內加上「父類別的名稱」
- 接下來,分別用每一個類別來建立一個物件
>>> class 空類別/父類別名稱():
pass
>>> class 子類別名稱(父類別名稱):
pass
>>> 文字1 = 父類別名稱()
>>> 文字2 = 子類別名稱()
# 定義一個空類別,稱為 Car
>>> class Car():
pass
# 定義一個 Car 的子類別,稱為 Yugo
# 定義子類別一樣使用 class 關鍵字,但是要在括號內加上父類別的名稱(下列的 class Yugo(Car) )
>>> class Yugo(Car):
pass
>>> give_me_a_car = Car()
>>> give_me_a_yugo = Yugo() # 名為 give_me_a_yugo 的物件是 Yugo 類別的一個特例,但它也繼承 Car 可做的所有事情
【範例二】繼承
- 子類別是父類別的特例,在物件導向術語中,Yugo is-a Car
- 名為 give_me_a_yugo 的物件是 Yugo 類別的一個特例,但它也繼承 Car 可做的所有事情
- 在這個例子中,Car 與 Yugo 不能拿來做什麼事情,所以我們來定義會做些事情的新類別:
>>> class 父類別名稱():
def 函式名稱(self):
print("字串")
>>> class 子類別名稱(父類別名稱):
pass
>>> 物件名稱1 = 父類別名稱()
>>> 物件名稱2 = 子類別名稱()
>>> 物件名稱1.函式名稱()
文字
>>> 物件名稱2.函式名稱()
文字
>>> class Car():
def exclaim(self):
print("I'm a Car!")
>>> class Yugo(Car):
pass
# 製作每個類別的物件,並呼叫 exclaim 方法
>>> give_me_a_car = Car()
>>> give_me_a_yugo = Yugo()
>>> give_me_a_car.exclaim()
I'm a Car!
# 在沒有做任何特殊事情的情況下,Yugo 會從 Car 繼承 exclaim() 方法
# 事實上 Yugo 說它是一輛 Car 很可能會導致身分認同危機
>>> give_me_a_yugo.exclaim()
I'm a Car!
- 在沒有做任何特殊事情的情況下,Yugo 會從 Car 繼承 exclaim() 方法
- 事實上 Yugo 說它是一輛 Car 很可能會導致身分認同危機。我們來看一下可以做些什麼