多重繼承 (multiple inheritance) 是指子類別 (subclass) 可以同時繼承 (inheritance) 多個父類別 (superclass) ,好獲得不同父類別的特性。
多重繼承的寫法就是在類別 (class) 識別字 (identifier) 後面的小括弧加上逗號,逗號後面放父類別的識別字,例如這裡類別 D 繼承了 A 、 B 、 C 三個類別
class A:
pass
class B:
pass
class C:
pass
class D(A, B, C):
pass
print(issubclass(D, A))
print(issubclass(D, B))
print(issubclass(D, C))
#《程式語言教學誌》的範例程式
# http://kaiching.org/
# 檔名:mi01.py
# 功能:示範定義類別
# 作者:張凱慶
於命令列執行以上程式,結果如下
$ python3 mi01.py |
True |
True |
True |
$ |
繼續看到類別屬性 (class attribute) 及類別方法 (class method) 在多重繼承中的情況,這裡 A2 、 B2 、 C2 有各自的類別屬性及類別方法,然後 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) 在多重繼承中的情況,這裡 A3 、 B3 、 C3 有各自的實體屬性及實體方法,然後 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() 先呼叫一次。
相關教學影片