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 繼承 DemoDemo2 ,多重繼承的寫法是在繼承的小括弧中以逗號區隔不同的父類別 (superclass)

 9
10
11
# 定義子類別
class Demo3(Demo, Demo2):
    pass

由於繼承會讓子類別 (subclass) 可以存取使用父類別的屬性 (attribute) 及方法 (method) ,所以這裡子類別可以存取兩個父類別的類別屬性 (class attribute) ab ,此例執行結果如下

> 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 月

這個例子 DemoDemo2 有相同的類別屬性 aDemo3 則是先繼承 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 一樣繼承 DemoDemo2 類別,兩個父類別有相同的實體屬性 aDemo3 的建構子依序呼叫 DemoDemo2 的建構子,由於 Demo2 的建構子最後被呼叫,因此實體屬性 a 會被設定成 Demo2 的值,執行結果如下

> python class_demo28.py
2
>

參考資料

上一頁 單元 62 - 繼承
回 Python 簡易手冊 首頁
下一頁 單元 64 - 多型
回 Python 教材首頁
回程式語言教材首頁