關於Python中函式過載問題的思考(原創)

weixin_30627341發表於2010-05-18

昨天和飛天舞者討論靜態型別語言和動態型別語言優劣比較的時候,說到Python沒有過載機制的問題。

後來想想挺有意思的,把思考的經過記錄下來,歡迎拍磚。

  1. 過載(overload)和覆蓋(override),在C++,Java,C#等靜態型別語言型別語言中,這兩個概念同時存在。前者是為了讓同一個函式名(方法名)匹配不同的引數(個數不同,型別不同);後者是為了實現多型,在相同名稱的函式(方法)和引數,在不同的類中(父類,子類),有不同的實現。
  2. Python是動態型別語言,不能簡單地說它支援或者不支援過載,我的思考結果是,過載仍然存在,只是以不同的方式呈現。原來我們理解的過載,都是在靜態型別語言中,關心引數個數以及引數型別;在動態型別語言裡的過載根本不需要關心引數型別,只需要關心引數個數。而在Python裡,關心引數個數的過載是由預設引數和傳遞引數名稱來實現的。這樣,程式設計師就沒有必要自己來寫兩個名稱一樣而引數不同的函式了!事實上,在同一個模組或者同一個類中,寫兩個名稱相同的方法的時候(引數個數是否相同不重要),後面的那個方法會簡單覆蓋前面的方面;其次,在子類繼承父類時,同名(不同參)的方法也會簡單覆蓋(子類覆蓋父類)。但是,這不說明Python沒有過載,它只是不需要程式設計師自己來實現過載(如果說程式設計師還需要做什麼的話,那就僅僅是要定義預設引數和引數名稱)。如果你需要過載的話,”預設引數+引數名傳遞“就能達到你想要的過載了!
  3. 有貼子會說,預設引數和過載是兩回事,但是我覺得,C++裡不允許同時定義預設引數和過載函式是有道理的,Java裡乾脆取消預設引數,只有過載方法也是有道理的,這個道理,就是”預設引數和基於引數個數的過載是一回事“。只是預設引數太不好控制了,特別是遇到中間一個引數是預設引數的情況,Python提供的解決辦法是:引數名傳遞!好牛叉的思想,呵呵,從這些小細節開始喜歡Python。別具一格,又把問題解決的如此完美,這就是處處為程式設計師著想的Python!

轉載於:https://www.cnblogs.com/maodouzi/archive/2010/05/18/1738224.html

相關文章