昨天和飛天舞者討論靜態類型語言和動態類型語言優劣比較的時候,說到Python沒有重載機制的問題。
后來想想挺有意思的,把思考的經過記錄下來,歡迎拍磚。
- 重載(overload)和覆蓋(override),在C++,Java,C#等靜態類型語言類型語言中,這兩個概念同時存在。前者是為了讓同一個函數名(方法名)匹配不同的參數(個數不同,類型不同);后者是為了實現多態,在相同名稱的函數(方法)和參數,在不同的類中(父類,子類),有不同的實現。
- Python是動態類型語言,不能簡單地說它支持或者不支持重載,我的思考結果是,重載仍然存在,只是以不同的方式呈現。原來我們理解的重載,都是在靜態類型語言中,關心參數個數以及參數類型;在動態類型語言里的重載根本不需要關心參數類型,只需要關心參數個數。而在Python里,關心參數個數的重載是由默認參數和傳遞參數名稱來實現的。這樣,程序員就沒有必要自己來寫兩個名稱一樣而參數不同的函數了!事實上,在同一個模塊或者同一個類中,寫兩個名稱相同的方法的時候(參數個數是否相同不重要),后面的那個方法會簡單覆蓋前面的方面;其次,在子類繼承父類時,同名(不同參)的方法也會簡單覆蓋(子類覆蓋父類)。但是,這不說明Python沒有重載,它只是不需要程序員自己來實現重載(如果說程序員還需要做什么的話,那就僅僅是要定義默認參數和參數名稱)。如果你需要重載的話,”默認參數+參數名傳遞“就能達到你想要的重載了!
- 有貼子會說,默認參數和重載是兩回事,但是我覺得,C++里不允許同時定義默認參數和重載函數是有道理的,Java里干脆取消默認參數,只有重載方法也是有道理的,這個道理,就是”默認參數和基於參數個數的重載是一回事“。只是默認參數太不好控制了,特別是遇到中間一個參數是默認參數的情況,Python提供的解決辦法是:參數名傳遞!好牛叉的思想,呵呵,從這些小細節開始喜歡Python。別具一格,又把問題解決的如此完美,這就是處處為程序員着想的Python!