老熟女激烈的高潮_日韩一级黄色录像_亚洲1区2区3区视频_精品少妇一区二区三区在线播放_国产欧美日产久久_午夜福利精品导航凹凸

重慶分公司,新征程啟航

為企業提供網站建設、域名注冊、服務器等服務

python新式類和經典類的區別是什么

這篇文章主要介紹了python新式類和經典類的區別是什么,具有一定借鑒價值,需要的朋友可以參考下。希望大家閱讀完這篇文章后大有收獲。下面讓小編帶著大家一起了解一下。

創新互聯建站專注于企業營銷型網站建設、網站重做改版、信陽網站定制設計、自適應品牌網站建設、H5網站設計成都商城網站開發、集團公司官網建設、外貿營銷網站建設、高端網站制作、響應式網頁設計等建站業務,價格優惠性價比高,為信陽等各大城市提供網站開發制作服務。

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”實例類型。

感謝你能夠認真閱讀完這篇文章,希望小編分享python新式類和經典類的區別是什么內容對大家有幫助,同時也希望大家多多支持創新互聯,關注創新互聯行業資訊頻道,遇到問題就找創新互聯,詳細的解決方法等著你來學習!


標題名稱:python新式類和經典類的區別是什么
新聞來源:http://www.xueling.net.cn/article/gpgedh.html

其他資訊

在線咨詢
服務熱線
服務熱線:028-86922220
TOP
主站蜘蛛池模板: 久久亚洲精品小早川怜子 | 国产精品一区二区 | 婷婷色香五月综合激激情 | 狠狠躁夜夜躁人人爽天天5 五十路熟妇强烈无码 | av图区| 国产精品一区二区在线观看不卡 | 欧美肥婆丰满bbw | 亚洲第一福利网站在线 | 99久久久国产精品免费消防器 | 午夜男女爽爽爽免费播放 | 啊灬啊灬啊灬快灬高潮少妇a片 | 日韩中文字幕在线观看 | 久久精品免费一区二区 | 狠狠色噜噜狠狠狠狠2021天天 | 啊轻点内射在线视频 | 麻豆国产一区二区三区四区 | 麻豆国产网站 | 天堂网91av | 中文字幕视频免费在线观看 | 麻豆av.com | 国产中年熟女高潮大集合 | 高清日本欧美久久 | 日韩欧美精品一区二区三区 | 日韩一区二区中文 | 成人免费午夜无码视频 | 一区二区视频网站 | 久久久国产精品无码一区二区 | 色婷婷一区二区三区在线观看 | 日本一级特黄毛片高清视频 | 91久操| 国产视频福利在线观看 | 亚洲国产精品成人av | 国产voyeur精品偷窥222 | 人人av在线 | 色欲av久久无码影院色戒 | 国产精品嫩草影院奶水 | 极品新婚夜少妇真紧 | 热99这里只有精品 | 日韩成人一区二区三区在线观看 | 成人免费视频网站在线观看 | 国产人妻精品区一区二区三区 |