重載,是指允許存在多個(gè)同名方法,而這些方法的參數(shù)不同洒疚。
多態(tài):是指子類重新定義父類的虛方法(virtual,abstract)征冷。當(dāng)子類重新定義了父類的虛方法后择膝,父類根據(jù)賦給它的不同的子類,動(dòng)態(tài)調(diào)用屬于子類的該方法检激,
重載(overload)和覆蓋(override)肴捉,在C++,Java叔收,C#等靜態(tài)類型語(yǔ)言類型語(yǔ)言中齿穗,這兩個(gè)概念同時(shí)存在。前者是為了讓同一個(gè)函數(shù)名(方法名)匹配不同的參數(shù)(個(gè)數(shù)不同饺律,類型不同);后者是為了實(shí)現(xiàn)多態(tài)缤灵,在相同名稱的函數(shù)(方法)和參數(shù),在不同的類中(父類蓝晒,子類)腮出,有不同的實(shí)現(xiàn)。
Python是動(dòng)態(tài)類型語(yǔ)言芝薇,不能簡(jiǎn)單地說(shuō)它支持或者不支持重載胚嘲,我的思考結(jié)果是,重載仍然存在洛二,只是以不同的方式呈現(xiàn)馋劈。原來(lái)我們理解的重載,都是在靜態(tài)類型語(yǔ)言中晾嘶,關(guān)心參數(shù)個(gè)數(shù)以及參數(shù)類型;在動(dòng)態(tài)類型語(yǔ)言里的重載根本不需要關(guān)心參數(shù)類型妓雾,只需要關(guān)心參數(shù)個(gè)數(shù)。而在Python里垒迂,關(guān)心參數(shù)個(gè)數(shù)的重載是由默認(rèn)參數(shù)和傳遞參數(shù)名稱來(lái)實(shí)現(xiàn)的械姻。這樣,程序員就沒有必要自己來(lái)寫兩個(gè)名稱一樣而參數(shù)不同的函數(shù)了机断!事實(shí)上楷拳,在同一個(gè)模塊或者同一個(gè)類中绣夺,寫兩個(gè)名稱相同的方法的時(shí)候(參數(shù)個(gè)數(shù)是否相同不重要),后面的那個(gè)方法會(huì)簡(jiǎn)單覆蓋前面的方面;其次欢揖,在子類繼承父類時(shí)陶耍,同名(不同參)的方法也會(huì)簡(jiǎn)單覆蓋(子類覆蓋父類)。但是她混,這不說(shuō)明Python沒有重載烈钞,它只是不需要程序員自己來(lái)實(shí)現(xiàn)重載(如果說(shuō)程序員還需要做什么的話,那就僅僅是要定義默認(rèn)參數(shù)和參數(shù)名稱)坤按。如果你需要重載的話毯欣,”默認(rèn)參數(shù)+參數(shù)名傳遞“就能達(dá)到你想要的重載了!
有貼子會(huì)說(shuō)晋涣,默認(rèn)參數(shù)和重載是兩回事,但是我覺得沉桌,C++里不允許同時(shí)定義默認(rèn)參數(shù)和重載函數(shù)是有道理的谢鹊,Java里干脆取消默認(rèn)參數(shù),只有重載方法也是有道理的留凭,這個(gè)道理佃扼,就是”默認(rèn)參數(shù)和基于參數(shù)個(gè)數(shù)的重載是一回事“。只是默認(rèn)參數(shù)太不好控制了蔼夜,特別是遇到中間一個(gè)參數(shù)是默認(rèn)參數(shù)的情況兼耀,Python提供的解決辦法是:參數(shù)名傳遞!好牛叉的思想求冷,呵呵瘤运,從這些小細(xì)節(jié)開始喜歡Python。別具一格匠题,又把問題解決的如此完美拯坟,這就是處處為程序員著想的Python!