課程
/后端開(kāi)發(fā)
/Python
/Python3 進(jìn)階教程
D不是繼承 B C么?? 為啥運(yùn)行結(jié)果不是? ABCD
2022-10-09
源自:Python3 進(jìn)階教程 3-4
正在回答
查了大量資料,大概是這樣。
python3的多繼承采用的是c3算法,將復(fù)雜結(jié)構(gòu)上的所有類(lèi)都映射到一個(gè)線(xiàn)性順序上,而這個(gè)順序能夠保證所有的類(lèi)都被構(gòu)造一次,這個(gè)也就是方法搜索的順序mro
針對(duì)題目中的代碼,mro順序?yàn)镈→B→C→A,這也就是方法的搜索順序,而每一次執(zhí)行方法的時(shí)候,比如執(zhí)行D類(lèi)的方法,碰到super()后就會(huì)跳過(guò)接下來(lái)的語(yǔ)句而直接往右邊的順序的類(lèi)中去繼續(xù)搜索方法,所以D類(lèi)的print語(yǔ)句就會(huì)被先跳過(guò),變成搜索B類(lèi)的方法,而B(niǎo)類(lèi)的方法中也有super(),所以也是繼續(xù)跳過(guò),直到A類(lèi)中沒(méi)有可以跳過(guò)的語(yǔ)句,就會(huì)先執(zhí)行打印出來(lái)print ('init A...'),然后也是根據(jù)順序依次把剩下的語(yǔ)句(此時(shí)剩下的都是print語(yǔ)句)都執(zhí)行,A類(lèi)執(zhí)行完到C類(lèi)到B類(lèi)到D類(lèi)。
提供一個(gè)網(wǎng)址:https://pythontutor.com/visualize.html#mode=edit
這個(gè)網(wǎng)站可以解析代碼的執(zhí)行順序與細(xì)節(jié),可以直觀(guān)查看代碼怎么執(zhí)行的~
土斤土斤
舉報(bào)
學(xué)習(xí)函數(shù)式、模塊和面向?qū)ο缶幊?,掌握Python高級(jí)程序設(shè)計(jì)
1 回答多重繼承傳參順序問(wèn)題
1 回答多態(tài)繼承順序
3 回答多重繼承問(wèn)題:super中傳一個(gè)多重繼承的類(lèi),只能識(shí)別到第一個(gè)
1 回答多重繼承init的參數(shù)問(wèn)題
1 回答多重繼承中屬性重名怎么辦
Copyright ? 2025 imooc.com All Rights Reserved | 京ICP備12003892號(hào)-11 京公網(wǎng)安備11010802030151號(hào)
購(gòu)課補(bǔ)貼聯(lián)系客服咨詢(xún)優(yōu)惠詳情
慕課網(wǎng)APP您的移動(dòng)學(xué)習(xí)伙伴
掃描二維碼關(guān)注慕課網(wǎng)微信公眾號(hào)
2022-12-07
查了大量資料,大概是這樣。
python3的多繼承采用的是c3算法,將復(fù)雜結(jié)構(gòu)上的所有類(lèi)都映射到一個(gè)線(xiàn)性順序上,而這個(gè)順序能夠保證所有的類(lèi)都被構(gòu)造一次,這個(gè)也就是方法搜索的順序mro
針對(duì)題目中的代碼,mro順序?yàn)镈→B→C→A,這也就是方法的搜索順序,而每一次執(zhí)行方法的時(shí)候,比如執(zhí)行D類(lèi)的方法,碰到super()后就會(huì)跳過(guò)接下來(lái)的語(yǔ)句而直接往右邊的順序的類(lèi)中去繼續(xù)搜索方法,所以D類(lèi)的print語(yǔ)句就會(huì)被先跳過(guò),變成搜索B類(lèi)的方法,而B(niǎo)類(lèi)的方法中也有super(),所以也是繼續(xù)跳過(guò),直到A類(lèi)中沒(méi)有可以跳過(guò)的語(yǔ)句,就會(huì)先執(zhí)行打印出來(lái)print ('init A...'),然后也是根據(jù)順序依次把剩下的語(yǔ)句(此時(shí)剩下的都是print語(yǔ)句)都執(zhí)行,A類(lèi)執(zhí)行完到C類(lèi)到B類(lèi)到D類(lèi)。
提供一個(gè)網(wǎng)址:https://pythontutor.com/visualize.html#mode=edit
這個(gè)網(wǎng)站可以解析代碼的執(zhí)行順序與細(xì)節(jié),可以直觀(guān)查看代碼怎么執(zhí)行的~
2022-10-10