重載,是指允許存在多個同名方法,而這些方法的參數(shù)不同。
多態(tài):是指子類重新定義父類的虛方法(virtual,abstract)。當(dāng)子類重新定義了父類的虛方法后,父類根據(jù)賦給它的不同的子類,動態(tài)調(diào)用屬于子類的該方法,
重載(overload)和覆蓋(override),在C++,Java,C#等靜態(tài)類型語言類型語言中,這兩個概念同時存在。前者是為了讓同一個函數(shù)名(方法名)匹配不同的參數(shù)(個數(shù)不同,類型不同);后者是為了實(shí)現(xiàn)多態(tài),在相同名稱的函數(shù)(方法)和參數(shù),在不同的類中(父類,子類),有不同的實(shí)現(xiàn)。
Python是動態(tài)類型語言,不能簡單地說它支持或者不支持重載,我的思考結(jié)果是,重載仍然存在,只是以不同的方式呈現(xiàn)。原來我們理解的重載,都是在靜態(tài)類型語言中,關(guān)心參數(shù)個數(shù)以及參數(shù)類型;在動態(tài)類型語言里的重載根本不需要關(guān)心參數(shù)類型,只需要關(guān)心參數(shù)個數(shù)。而在Python里,關(guān)心參數(shù)個數(shù)的重載是由默認(rèn)參數(shù)和傳遞參數(shù)名稱來實(shí)現(xiàn)的。這樣,程序員就沒有必要自己來寫兩個名稱一樣而參數(shù)不同的函數(shù)了!事實(shí)上,在同一個模塊或者同一個類中,寫兩個名稱相同的方法的時候(參數(shù)個數(shù)是否相同不重要),后面的那個方法會簡單覆蓋前面的方面;其次,在子類繼承父類時,同名(不同參)的方法也會簡單覆蓋(子類覆蓋父類)。但是,這不說明Python沒有重載,它只是不需要程序員自己來實(shí)現(xiàn)重載(如果說程序員還需要做什么的話,那就僅僅是要定義默認(rèn)參數(shù)和參數(shù)名稱)。如果你需要重載的話,”默認(rèn)參數(shù)+參數(shù)名傳遞“就能達(dá)到你想要的重載了!
有貼子會說,默認(rèn)參數(shù)和重載是兩回事,但是我覺得,C++里不允許同時定義默認(rèn)參數(shù)和重載函數(shù)是有道理的,Java里干脆取消默認(rèn)參數(shù),只有重載方法也是有道理的,這個道理,就是”默認(rèn)參數(shù)和基于參數(shù)個數(shù)的重載是一回事“。只是默認(rèn)參數(shù)太不好控制了,特別是遇到中間一個參數(shù)是默認(rèn)參數(shù)的情況,Python提供的解決辦法是:參數(shù)名傳遞!好牛叉的思想,呵呵,從這些小細(xì)節(jié)開始喜歡Python。別具一格,又把問題解決的如此完美,這就是處處為程序員著想的Python!