天蓬老师2017-04-17 13:18:46
因為子類別無法推論出該如何呼叫父類別的建構函數,例如
class A():
def __init__(a, b):
pass
class B(A):
def __init__(c):
pass
觀察一下C++的建構子的處理情況,注意看第五條
- 如果子類別沒有定義建構方法,則呼叫父類別的無參數的建構方法。
- 如果子類別定義了建構方法,不論是無參數還是帶參數,在創建子類別的物件的時候,首先執行父類別無參數的建構方法,然後執行自己的建構方法。
- 在建立子類別物件時候,如果子類別的建構子沒有顯示呼叫父類別的建構函數,則會呼叫父類別的預設無參構造函數。
- 在建立子類別物件時候,如果子類別的建構子沒有顯示呼叫父類別的建構函式且父類別自己提供了無參建構函數,則會呼叫父類別自己的無參構造函數。
- 在建立子類別物件時候,如果子類別的建構子沒有顯示呼叫父類別的建構子且父類別只定義了自己的有參構造函數,則會出錯(如果父類別只有有參數的建構方法,則子類別必須顯示呼叫此帶參構造方法)。
子類別的建構函數,可能父類別的參數個數、順序都與不一致,所以也無法推測出應該如何呼叫父類別的建構子。
對於Python這種只能定義一個「建構子」的語言來說,也不能保證像C++一樣 肯定有一個無參數建構函數,所以...只能手動呼叫了