欧美三区_成人在线免费观看视频_欧美极品少妇xxxxⅹ免费视频_a级毛片免费播放_鲁一鲁中文字幕久久_亚洲一级特黄

Python中新式類與經(jīng)典類的區(qū)別詳析

系統(tǒng) 1643 0

1.新式類與經(jīng)典類

在Python 2及以前的版本中,由任意內(nèi)置類型派生出的類(只要一個(gè)內(nèi)置類型位于類樹的某個(gè)位置),都屬于“新式類”,都會(huì)獲得所有“新式類”的特性;反之,即不由任意內(nèi)置類型派生出的類,則稱之為“經(jīng)典類”。

“新式類”和“經(jīng)典類”的區(qū)分在Python 3之后就已經(jīng)不存在,在Python 3.x之后的版本,因?yàn)樗械念惗寂缮詢?nèi)置類型object(即使沒有顯示的繼承object類型),即所有的類都是“新式類”。

官方文檔 https://www.python.org/doc/newstyle/

2.繼承順序的區(qū)別

主要是在多重繼承時(shí)才會(huì)遇到這個(gè)問題。

經(jīng)典類的鉆石繼承是深度優(yōu)先,即從下往上搜索;新式類的繼承順序是采用C3算法(非廣度優(yōu)先)。

對(duì)經(jīng)典類進(jìn)行代碼驗(yàn)證(所有經(jīng)典類的代碼必須在Python2下運(yùn)行,下同),ClassicClassB 繼承自 ClassicClassA,SubClassicClass繼承自ClassicClassB,ClassicClassC:

            
class ClassicClassA():
 var = 'Classic Class A'


class ClassicClassB(ClassicClassA):
 pass


class ClassicClassC():
 var = 'Classic Class C'


class SubClassicClass(ClassicClassB, ClassicClassC):
 pass


if __name__ == '__main__':
 print(SubClassicClass.var)
          

在SubClassicClass對(duì)var屬性進(jìn)行搜索的過程中,根據(jù)從下到上的原則,會(huì)優(yōu)先搜索ClassicClassB,而ClassicClassB沒有var屬性,會(huì)繼續(xù)往上搜索ClassicClassB的超類ClassicClassA,在ClassicClassA中發(fā)現(xiàn)var屬性后停止搜索,var的值為ClassicClassA中var的值;而ClassicClassC的var屬性從始至終都未被搜索到。

從運(yùn)行結(jié)果可以看出,輸出的是Classic Class A,可見類繼承的搜索是深度優(yōu)先,由下至上進(jìn)行搜索。

Classic Class A?

新式類的繼承順序并非是廣度優(yōu)先,而是C3算法,只是在部分情況下,C3算法的結(jié)果恰巧與廣度優(yōu)先的結(jié)果相同。

對(duì)新式類的繼承搜索順序進(jìn)行代碼驗(yàn)證,新式類中,可以使用mro函數(shù)來查看類的搜索順序(這也算是一個(gè)區(qū)別),如SubNewStyleClass.mro()。

            
class NewStyleClassA(object):
 var = 'New Style Class A'


class NewStyleClassB(NewStyleClassA):
 pass


class NewStyleClassC(NewStyleClassA):
 var = 'New Style Class C'


class SubNewStyleClass(NewStyleClassB, NewStyleClassC):
 pass


if __name__ == '__main__':
 print(SubNewStyleClass.mro())
 print(SubNewStyleClass.var)
          

從代碼運(yùn)行結(jié)果看,恰巧與從左至右的廣度優(yōu)先預(yù)期結(jié)果相同。

[ , , , , ]
New Style Class C

但是不代表新式類的繼承順序就是廣度優(yōu)先,可以稍微修改下代碼進(jìn)行驗(yàn)證:NewStyleClassC改為繼承自object

            
class NewStyleClassA(object):
 var = 'New Style Class A'


class NewStyleClassB(NewStyleClassA):
 pass


class NewStyleClassC(object):
 var = 'New Style Class C'


class SubNewStyleClass(NewStyleClassB, NewStyleClassC):
 pass


if __name__ == '__main__':
 print(SubNewStyleClass.mro())
 print(SubNewStyleClass.var)
          

運(yùn)行結(jié)果不再符合廣度優(yōu)先:

[ , , , , ]
New Style Class A

可見,新式類的繼承順序并非廣度優(yōu)先,而是C3算法。至于C3算法,以后再另外詳細(xì)寫。

3.類實(shí)例類型的區(qū)別

在經(jīng)典類中,所有的類都是classobj類型,而類的實(shí)例都是instance類型。類與實(shí)例只有通過__class__屬性進(jìn)行關(guān)聯(lián)。這樣在判斷實(shí)例類型時(shí),就會(huì)造成不便:所有的實(shí)例都是instance類型。

            
class A():pass
class B():pass

a = A()
b = B()

if __name__ == '__main__':
 print(type(a))
 print(type(b))
 print(type(a) == type(b))
          

type(a) == type(b)的結(jié)果永遠(yuǎn)為True,那這樣的比較就毫無意義。

更為麻煩的是,經(jīng)典類的實(shí)例是instance類型,而內(nèi)置類的實(shí)例卻不是,無法統(tǒng)一。

通過代碼判斷下內(nèi)置類型list的實(shí)例[1, 2, 3]是什么類型

            
print(type([1, 2, 3]))
          

運(yùn)行結(jié)果,是list類型


內(nèi)置類的實(shí)例類型和經(jīng)典類的實(shí)例類型完全不同,容易造成困惑,不利于代碼的統(tǒng)一。

這個(gè)問題在Python 3之后就不復(fù)存在了,因?yàn)镻ython3中所有的類都是新式類,新式類中類與類型已經(jīng)統(tǒng)一:類實(shí)例的類型是這個(gè)實(shí)例所創(chuàng)建自的類(通常是和類實(shí)例的__class__相同),而不再是Python 2.x版本中的“instance”實(shí)例類型。

更詳細(xì)的:https://www.jb51.net/article/165048.htm

總結(jié)

以上就是這篇文章的全部?jī)?nèi)容了,希望本文的內(nèi)容對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,謝謝大家對(duì)腳本之家的支持。


更多文章、技術(shù)交流、商務(wù)合作、聯(lián)系博主

微信掃碼或搜索:z360901061

微信掃一掃加我為好友

QQ號(hào)聯(lián)系: 360901061

您的支持是博主寫作最大的動(dòng)力,如果您喜歡我的文章,感覺我的文章對(duì)您有幫助,請(qǐng)用微信掃描下面二維碼支持博主2元、5元、10元、20元等您想捐的金額吧,狠狠點(diǎn)擊下面給點(diǎn)支持吧,站長(zhǎng)非常感激您!手機(jī)微信長(zhǎng)按不能支付解決辦法:請(qǐng)將微信支付二維碼保存到相冊(cè),切換到微信,然后點(diǎn)擊微信右上角掃一掃功能,選擇支付二維碼完成支付。

【本文對(duì)您有幫助就好】

您的支持是博主寫作最大的動(dòng)力,如果您喜歡我的文章,感覺我的文章對(duì)您有幫助,請(qǐng)用微信掃描上面二維碼支持博主2元、5元、10元、自定義金額等您想捐的金額吧,站長(zhǎng)會(huì)非常 感謝您的哦!!!

發(fā)表我的評(píng)論
最新評(píng)論 總共0條評(píng)論
主站蜘蛛池模板: 极品逼| 亚洲综合精品一区二区三区中文 | 国产h视频在线观看高清 | 国产成人久久婷婷精品流白浆 | 天天操天天玩 | 亚洲国产第一区二区香蕉 | 久久国产天堂福利天堂 | 国产免费av在线 | 久久穴 | 永久免费av | 欧美一级毛片免费播放器 | 一级毛片免费不卡在线 | 久久久久久久国产精品 | 波多野结衣办公室在线观看 | 亚洲三级视频 | 久久久av | 亚洲AV在线无码播放毛片浪潮 | 四虎在线免费观看视频 | 欧美综合中文字幕久久 | 欧美18videosex性欧美群 | 国产在线视频2019最新视频 | 999jjj在线播放 | 小优视频为爱而生懂你更多茄子 | 亚洲综合五月天激动情网 | 亚洲午夜在线观看 | 美女超碰 | www.天天操 | 国产精品欧美一区二区三区 | 欧美高清成人 | 黑人巨大精品 | 青青青青娱乐 | 久久青青操| 91看片淫黄大片一级在线观看 | 国产精品色综合 | 日本黄色小视频在线观看 | 亚洲精品久久久蜜桃 | 日韩中文字幕在线播放 | 久久色亚洲| 久久精品国产第一区二区 | 一级理伦 | 亚洲精品一区二区深夜福利 |