亚洲免费在线-亚洲免费在线播放-亚洲免费在线观看-亚洲免费在线观看视频-亚洲免费在线看-亚洲免费在线视频

Python中新式類與經典類的區別詳析

系統 1770 0

1.新式類與經典類

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

“新式類”和“經典類”的區分在Python 3之后就已經不存在,在Python 3.x之后的版本,因為所有的類都派生自內置類型object(即使沒有顯示的繼承object類型),即所有的類都是“新式類”。

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

2.繼承順序的區別

主要是在多重繼承時才會遇到這個問題。

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

對經典類進行代碼驗證(所有經典類的代碼必須在Python2下運行,下同),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對var屬性進行搜索的過程中,根據從下到上的原則,會優先搜索ClassicClassB,而ClassicClassB沒有var屬性,會繼續往上搜索ClassicClassB的超類ClassicClassA,在ClassicClassA中發現var屬性后停止搜索,var的值為ClassicClassA中var的值;而ClassicClassC的var屬性從始至終都未被搜索到。

從運行結果可以看出,輸出的是Classic Class A,可見類繼承的搜索是深度優先,由下至上進行搜索。

Classic Class A?

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

對新式類的繼承搜索順序進行代碼驗證,新式類中,可以使用mro函數來查看類的搜索順序(這也算是一個區別),如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)
          

從代碼運行結果看,恰巧與從左至右的廣度優先預期結果相同。

[ , , , , ]
New Style Class C

但是不代表新式類的繼承順序就是廣度優先,可以稍微修改下代碼進行驗證: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)
          

運行結果不再符合廣度優先:

[ , , , , ]
New Style Class A

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

3.類實例類型的區別

在經典類中,所有的類都是classobj類型,而類的實例都是instance類型。類與實例只有通過__class__屬性進行關聯。這樣在判斷實例類型時,就會造成不便:所有的實例都是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)的結果永遠為True,那這樣的比較就毫無意義。

更為麻煩的是,經典類的實例是instance類型,而內置類的實例卻不是,無法統一。

通過代碼判斷下內置類型list的實例[1, 2, 3]是什么類型

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

運行結果,是list類型


內置類的實例類型和經典類的實例類型完全不同,容易造成困惑,不利于代碼的統一。

這個問題在Python 3之后就不復存在了,因為Python3中所有的類都是新式類,新式類中類與類型已經統一:類實例的類型是這個實例所創建自的類(通常是和類實例的__class__相同),而不再是Python 2.x版本中的“instance”實例類型。

更詳細的:https://www.jb51.net/article/165048.htm

總結

以上就是這篇文章的全部內容了,希望本文的內容對大家的學習或者工作具有一定的參考學習價值,謝謝大家對腳本之家的支持。


更多文章、技術交流、商務合作、聯系博主

微信掃碼或搜索:z360901061

微信掃一掃加我為好友

QQ號聯系: 360901061

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

【本文對您有幫助就好】

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

發表我的評論
最新評論 總共0條評論
主站蜘蛛池模板: 成年黄网站免费大全毛片 | 老子影院午夜久久亚洲 | 在线视频99 | 日一日操一操 | 996re免费热在线视频手机 | 精品毛片免费看 | 久久精品男人影院 | 奇米影视777狠狠狠888不卡 | 国产二三区 | 欧美日韩一区二区三区自拍 | 欧美国产成人免费观看永久视频 | 日韩经典欧美精品一区 | 久久经典 | 天天爽夜夜爽免费看 | 亚洲人成网站在线观看青青 | 国产原创精品 | 欧美成人毛片在线视频 | 呦女www| 精品久久看 | 在线99| 激情五月色婷婷丁香伊人 | 天天躁夜夜躁狂狂躁综合 | 97欧美精品一区二区三区 | 日本在线黄色 | 国产精品久久久久影院色老大 | 四虎影视在线观看2413 | 色之综合网 | 免费国产成人高清在线观看麻豆 | 中文字幕亚洲第一 | 亚洲综合久久综合激情久久 | 国产综合色在线视频区 | 夜夜爽天天狠狠九月婷婷 | 性欧美video另类3d | 婷婷狠狠| 第一色区 | 成人网影 | 国产大尺度视频 | 日本午夜www高清视频 | 88国产精品欧美一区二区三区 | 欧美色射 | 国产成人亚洲精品91专区手机 |