Python 簡易手冊
單元 63 - 多重繼承
Python 的繼承 (inheritance) 允許超過一個繼承來源,這叫做多重繼承 (multiple inheritance) ,以下簡單示範寫法
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 | # 定義父類別 class Demo: a = 1 # 定義父類別 class Demo2: b = 2 # 定義子類別 class Demo3(Demo, Demo2): pass # 建立子類別物件 d = Demo3() # 印出屬性 print(d.a) print(d.b) # 檔名: class_demo26.py # 說明: 《Python簡易手冊》的範例 # 網址: http://kaiching.org # 作者: Kaiching Chang # 時間: 2024 年 3 月 |
單元 54 - 類別介紹類別 (class) 的基本概念,單元 62 - 繼承介紹單一繼承寫法與特性,單元 49 - pass 陳述與省略符號 ...介紹關鍵字 (keyword) pass 的用法,單元 58 - 類別屬性與類別方法介紹如何定類別屬性 (class attribute) 。
Demo3 繼承 Demo 與 Demo2 ,多重繼承的寫法是在繼承的小括弧中以逗號區隔不同的父類別 (superclass)
9 10 11 | # 定義子類別 class Demo3(Demo, Demo2): pass |
由於繼承會讓子類別 (subclass) 可以存取使用父類別的屬性 (attribute) 及方法 (method) ,所以這裡子類別可以存取兩個父類別的類別屬性 (class attribute) a 與 b ,此例執行結果如下
> python class_demo26.py |
1 2 |
> |
但是如果繼承的多個父類別有相同的屬性或方法,那子類別連接的屬性及方法會以先被繼承的繼承的為主,也就是繼承小括弧中排在前面的類別,例如
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 | # 定義父類別 class Demo: a = 1 # 定義父類別 class Demo2: a = 2 # 定義子類別 class Demo3(Demo2, Demo): pass # 建立子類別物件 d = Demo3() # 印出屬性 print(d.a) # 檔名: class_demo27.py # 說明: 《Python簡易手冊》的範例 # 網址: http://kaiching.org # 作者: Kaiching Chang # 時間: 2024 年 3 月 |
這個例子 Demo 跟 Demo2 有相同的類別屬性 a , Demo3 則是先繼承 Demo2 ,底下示範印出 Demo3 的類別屬性 a ,執行結果如下
> python class_demo27.py |
2 |
> |
但是如果是建構子 (constructor) 中設定的實體屬性 (instance attribute) ,這會以最後被呼叫的為主,例如
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 | # 定義父類別 class Demo: # 定義父類別的建構子 def __init__(self): self.a = 1 # 定義父類別 class Demo2: # 定義父類別的建構子 def __init__(self): self.a = 2 # 定義子類別 class Demo3(Demo, Demo2): # 定義子類別的建構子 def __init__(self): Demo.__init__(self) Demo2.__init__(self) # 建立子類別物件 d = Demo3() # 印出屬性 print(d.a) # 檔名: class_demo28.py # 說明: 《Python簡易手冊》的範例 # 網址: http://kaiching.org # 作者: Kaiching Chang # 時間: 2024 年 3 月 |
單元 56 - 建構子與解構子介紹如何定義建構子。
這個例子 Demo3 一樣繼承 Demo 與 Demo2 類別,兩個父類別有相同的實體屬性 a , Demo3 的建構子依序呼叫 Demo 及 Demo2 的建構子,由於 Demo2 的建構子最後被呼叫,因此實體屬性 a 會被設定成 Demo2 的值,執行結果如下
> python class_demo28.py |
2 |
> |