Python 速查手冊

6.9 多重繼承

多重繼承 (multiple inheritance) 是指子類別 (subclass) 可以同時繼承 (inheritance) 多個父類別 (superclass) ,好獲得不同父類別的特性。

多重繼承的寫法就是在類別 (class) 識別字 (identifier) 後面的小括弧加上逗號,逗號後面放父類別的識別字,例如這裡類別 D 繼承了 ABC 三個類別

class A:
    pass

class B:
    pass

class C:
    pass

class D(A, B, C):
    pass

print(issuclass(D, A))
print(issuclass(D, B))
print(issuclass(D, C))

#《程式語言教學誌》的範例程式
# http://kaiching.org/
# 檔名:mi01.py
# 功能:示範定義類別
# 作者:張凱慶

於命令列執行以上程式,結果如下

$ python3 mi01.py
True
True
True
$

繼續看到類別屬性 (class attribute) 及類別方法 (class method) 在多重繼承中的情況,這裡 A2B2C2 有各自的類別屬性及類別方法,然後 D2 繼承這三個類別,然後用內建函數 (built-in function) print() 印出三個類別屬性,然後依序呼叫三個類別方法,可以看到 D2 可以使用三個父類別的類別屬性及類別方法。

class A2:
    a = "A2"
    
    @classmethod
    def print_a(cls):
        print(cls.a)

class B2:
    b = "B2"
    
    @classmethod
    def print_b(cls):
        print(cls.b)

class C2:
    c = "C2"
    
    @classmethod
    def print_c(cls):
        print(cls.c)

class D2(A2, B2, C2):
    pass

D2.print_a()
D2.print_b()
D2.print_c()

#《程式語言教學誌》的範例程式
# http://kaiching.org/
# 檔名:mi02.py
# 功能:示範定義類別
# 作者:張凱慶

於命令列執行以上程式,結果如下

$ python3 mi02.py
A2
B2
C2
$

繼續看到實體屬性 (instance attribute) 及實體方法 (instance method) 在多重繼承中的情況,這裡 A3B3C3 有各自的實體屬性及實體方法,然後 D3 繼承這三個類別,注意在 D3__init__() 方法中要先用 super() 呼叫 __init__() ,再依序用 super() 以父類別及 self 當參數,呼叫每一個父類別的 __init__() 方法

class A3:
    def __init__(self):
        self.a = "A3"
    
    def print_a(self):
        print(self.a)

class B3:
    def __init__(self):
        self.b = "B3"
    
    def print_b(self):
        print(self.b)

class C3:
    def __init__(self):
        self.c = "C3"
    
    def print_c(self):
        print(self.c)

class D3(A3, B3, C3):
    def __init__(self):
        super().__init__()
        super(A3, self).__init__()
        super(B3, self).__init__()
        super(C3, self).__init__()

d = D3()
d.print_a()
d.print_b()
d.print_c()

#《程式語言教學誌》的範例程式
# http://kaiching.org/
# 檔名:mi03.py
# 功能:示範定義類別
# 作者:張凱慶

於命令列執行以上程式,結果如下

$ python3 mi03.py
A3
B3
C3
$

之所以要這麼做,這是因為依序呼叫每個父類別的 __init__() 才能有效繼承每個父類別的實體屬性,不然子類別只會繼承其中一個父類別的 __init__() ,對於其他跟父類別同名稱的方法亦同,若是需要先實作父類別同名稱的方法,就要用 super() 先呼叫一次。

上一頁: 6.8 子類別的方法改寫
Python 速查手冊 - 目錄
下一頁: 6.10 多型
回 Python 教材首頁