|
單繼承時(shí)super()和__init__()實(shí)現(xiàn)的功能是類似的
輸出結(jié)果:
區(qū)別是使用super()繼承時(shí)不用顯式引用基類。 super()只能用于新式類中 把基類改為舊式類,即不繼承任何基類
執(zhí)行時(shí),在初始化b時(shí)就會(huì)報(bào)錯(cuò):
super不是父類,而是繼承順序的下一個(gè)類 在多重繼承時(shí)會(huì)涉及繼承順序,super()相當(dāng)于返回繼承順序的下一個(gè)類,而不是父類,類似于這樣的功能:
mro()用來獲得類的繼承順序。 例如:
輸出結(jié)果如下:
supder和父類沒有關(guān)聯(lián),因此執(zhí)行順序是A —> B—>—>Base 執(zhí)行過程相當(dāng)于:初始化childC()時(shí),先會(huì)去調(diào)用childA的構(gòu)造方法中的 super(childA, self).__init__(), super(childA, self)返回當(dāng)前類的繼承順序中childA后的一個(gè)類childB;然后再執(zhí)行childB().__init()__,這樣順序執(zhí)行下去。 在多重繼承里,如果把childA()中的 super(childA, self).__init__() 換成Base.__init__(self),在執(zhí)行時(shí),繼承childA后就會(huì)直接跳到Base類里,而略過了childB:
從super()方法可以看出,super()的第一個(gè)參數(shù)可以是繼承鏈中任意一個(gè)類的名字, 如果是本身就會(huì)依次繼承下一個(gè)類; 如果是繼承鏈里之前的類便會(huì)無限遞歸下去; 如果是繼承鏈里之后的類便會(huì)忽略繼承鏈匯總本身和傳入類之間的類; 比如將childA()中的super改為:super(childC, self).init(),程序就會(huì)無限遞歸下去。 如:
super()可以避免重復(fù)調(diào)用 如果childA基礎(chǔ)Base, childB繼承childA和Base,如果childB需要調(diào)用Base的__init__()方法時(shí),就會(huì)導(dǎo)致__init__()被執(zhí)行兩次:
Base的__init__()方法被執(zhí)行了兩次
使用super()是可避免重復(fù)調(diào)用
以上所述是小編給大家介紹的python類中super()和__init__()的區(qū)別,希望對(duì)大家有所幫助,如果大家有任何疑問請給我留言,小編會(huì)及時(shí)回復(fù)大家的。在此也非常感謝大家對(duì)腳本之家網(wǎng)站的支持! 您可能感興趣的文章:微信公眾號(hào)搜索 “ 腳本之家 ” ,選擇關(guān)注 業(yè)界資訊、不定期紅包、送書等活動(dòng)等著你 |
|
|