多型
其實多型可算是物件導向的精華,他讓繼承自相同父類別的子類別,能夠在呼叫同名的方法時,能展現出個子類別的實作,這聽起來有點玄,但是很容易理解,我們用剛剛的 Cat
和 Dog
類別做個示範:
dog = Dog('Paul')
cat = Cat('Kitty')
dog.shout()
cat.shout()
我們會發現,大家都呼叫的是 shout
方法,但是結果卻不相同,這看上去沒啥好講的,畢竟我們都個別定義了方法,但這其實是動態語言的福利,要知道,在 Python 中,變數是沒有型態的,有型態的是變數參照的資料。當我們利用變數呼叫方法時 (如: dog.shout()
),Python 只需要確定當下變數參照的資料是有該方法的就行了 (dog
有,cat
也有)。這會導致一個有趣的現象出現,今天機器狗明明不是動物,但如果 MachineDog
類別中有定義 shout
方法,他一樣可以叫,這就是頂頂有名的 duck typing。
duck typing(鴨子定型):如果他走路像鴨子,而且叫聲像鴨子,那他就是一支鴨子,我們不在乎是哪種物件呼叫了某特定方法,只要該物件有這個方法就行了。