日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問(wèn) 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) > 编程语言 > python >内容正文

python

python3类的继承详解_python3 多重继承机制

發(fā)布時(shí)間:2025/3/15 python 11 豆豆
生活随笔 收集整理的這篇文章主要介紹了 python3类的继承详解_python3 多重继承机制 小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

由于python中包含多重繼承機(jī)制,那么子類在多重繼承中,到底用的是哪一個(gè)超類的方法就是大家關(guān)心的問(wèn)題,之前在查閱已有書(shū)籍無(wú)果后,只得去翻官方文檔與博客,終于得解,于是在此總結(jié)歸納。

全稱 方法解析順序(Method Resolution Order) 簡(jiǎn)稱為 MRO 這個(gè)東西就是來(lái)解決多重繼承的解析問(wèn)題的,如果一般只關(guān)心順序,不關(guān)心解析順序怎么來(lái)的話,只要用類下的__ mro __的特殊方法,即可得到解析順序鏈。

python3與python2.2之前的解析方法并不相同,至于原因嘛,往下看就知道了。

舉個(gè)例子:

繼承的例子

Python 2.2 進(jìn)行解析的順序可以看做 廣度優(yōu)先 ,該結(jié)構(gòu)在python2.2之前能夠正常解析為[F, A, B, X, Y]的解析鏈。

首先我們看下各個(gè)類中的方法解析順序:這里A,B只有一層父子繼承關(guān)系,根據(jù)繼承的左右順序容易得出繼承鏈,(python2.2)與C3這時(shí)效果相同,對(duì)于 A 來(lái)說(shuō),其搜索順序?yàn)?[A, X, Y];對(duì)于 B,其搜索順序?yàn)?[B, Y, X];

關(guān)鍵在對(duì)于 F的解析上,python2.2之前其搜索順序?yàn)?[F, A, B, X, Y]。

這樣的結(jié)果是否合理呢?

對(duì)于F的繼承順序python3如何求解呢?

為了方便展示算法邏輯,首先規(guī)定幾個(gè)約定:

1.[c1, c2, c3, c4 .... cN] 代表N個(gè)類的解析列表

2.c1 + [c2, c3, c4 .... cN] = [c1, c2, c3, c4 .... cN] #解析列表的拼接方式

3.head([c1, c2, c3, c4 .... cN]) = c1 #取一個(gè)列表的頭部

4.tail([c1, c2, c3, c4 .... cN]) = [c2, c3, c4 .... cN] #剔除掉列表頭部的剩余部分

那么就從下面這個(gè)公式中展開(kāi),就是對(duì)merge的操作遞歸

#假設(shè)類C繼承自父類b1 b2 b3,那么C的繼承鏈如下

L[c] = c + merge(L[b1], L[b2], L[b3], b1, b2, b3)

c3算法流程

1.取出merge中第一個(gè)列表K1

2.取出h = head(K1),遍歷后續(xù)解析列表中所有的tail(KN),若tail中沒(méi)有出現(xiàn)了h,就將h從merge中所有列表中清除,并循環(huán)2

3.若當(dāng)前的h不符合要求則替換下一個(gè)K

4.若merge中所有的類被清除則正常輸出繼承解析列表,否則則拋出異常

好了對(duì)于F來(lái)說(shuō)我們一步步來(lái)推導(dǎo):

L[A] = [A, X, Y]

L[B] = [B, Y, X]

L[F] = F + merge(L[A], L[B] , A, B)

L[F] = F + merge([A, X, Y], [B, Y, X] , A, B)

這時(shí)讓我們開(kāi)始跑merge

L[F] = [F,A] + merge([X, Y], [B, Y, X] , B) (1)

L[F] = [F,A,B] + merge([X, Y], [Y, X]) (2)

然而當(dāng)繼續(xù)往下執(zhí)行的時(shí)候C3算法會(huì)拋出異常

L[F] = [F,A,B] + merge([X, Y], [Y, X]) (3)

因?yàn)樗薪馕隽斜硪呀?jīng)遍歷完,但是merge中的類并沒(méi)有清除完成。

那么C3算法為何要這么設(shè)計(jì)?

仔細(xì)看由python2.2之前推導(dǎo)的繼承鏈我們會(huì)發(fā)現(xiàn),B 和 F 中 X、Y 的搜索順序是相反的!也就是說(shuō),當(dāng) B 被繼承時(shí),它本身的繼承鏈竟然也發(fā)生了改變,這很容易導(dǎo)致不易察覺(jué)的大坑。

C3算法 秉承的原則是子類形成的繼承鏈,應(yīng)該能完整的繼承超類的繼承鏈,而不是對(duì)超類的繼承鏈進(jìn)行改造而適配子類的繼承鏈。因此python2.2在大量的多重繼承后會(huì)引發(fā)意想不到的BUG,而當(dāng)你的繼承鏈出現(xiàn)類似例子中的情況時(shí),C3則會(huì)拋出異常,提前終止你的不當(dāng)繼承行為。以上是個(gè)人的一些理解,如有不對(duì)可以評(píng)論探討。

相關(guān)資料:

總結(jié)

以上是生活随笔為你收集整理的python3类的继承详解_python3 多重继承机制的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。

如果覺(jué)得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。