Python 速查手冊

6.8 子類別的方法改寫

子類別 (subclass) 繼承父類別 (superclass) 之後,子類別會得到父類別的所有方法 (method) 跟屬性 (attribute) ,這時候子類別只要重新定義跟父類別相同識別字 (identifier) 的方法,就會改寫 (override) 父類別原先定義的方法。

先來看到 __init__() 方法的改寫, Demo2 繼承自 DemoDemo2 重新定義了 __init__() 方法,因此在建立 Demo2 物件 (object) 實體 (instance) 的時候,會執行 Demo2__init__() 方法

class Demo:
    def __init__(self):
        print("demo")

class Demo2(Demo):
    def __init__(self):
        print("dmeo2")

d = Demo2()

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

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

$ python3 override01.py
demo2
$

如果希望先執行父類別的 __init__() 方法,就要用內建函數 (built-in function) super() 先行呼叫父類別的 __init__() 方法,例如這裡 Demo3 繼承自 Demo 類別, super() 方法在 __init__() 方法的第一行,因此建立 Demo3 的實體物件會先執行 Demo__init__() 方法,然後才執行 Demo3 自己 __init__() 方法

from override01 import Demo

class Demo3(Demo):
    def __init__(self):
        super().__init__()
        print("demo3")

d = Demo3()

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

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

$ python3 override02.py
demo2
demo
demo3
$

就一般的方法而言也是一樣的,這裡 Demo5 類別繼承自 Demo4 ,同樣兩者都有 demo() 方法, Demo4demo() 方法先呼叫 super()dmeo() 方法,因此 demo 字串 (string) 先於 subdemo 字串印出

class Demo4:
    def demo(self):
        print("demo")

class Demo5(Demo4):
    def demo(self):
        super().demo()
        print("subdemo")

d = Demo5()
d.demo()

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

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

$ python3 override03.py
demo
subdemo
$

最後來看看在多重繼承 (multiple inheritance) 下子類別方法的改寫,這裡 D4 類別繼承自 D1D2D3 類別, D4__init__() 方法先用 super() 呼叫 __init__() 後,再個別以 D1D2D3 ,加上第二個參數 self 呼叫 __init__() 一次,這是由於 super() 的運作方式的原因,確保三個父類別的 __init__() 都會執行

class D1:
    def __init__(self):
        print(1)

class D2:
    def __init__(self):
        print(2)

class D3:
    def __init__(self):
        print(3)

class D4(D1, D2, D3):
    def __init__(self):
        super().__init__()
        super(D1, self).__init__()
        super(D2, self).__init__()
        super(D3, self).__init__()
        print(4)

d = D4()

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

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

$ python3 override04.py
1
2
3
4
$

上一頁: 6.7 繼承
Python 速查手冊 - 目錄
下一頁: 6.9 多重繼承
回 Python 教材首頁