最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

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

 更新時(shí)間:2019年07月10日 11:08:26   作者:BlackMatrix  
這篇文章主要給大家介紹了關(guān)于Python中新式類與經(jīng)典類的區(qū)別,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家學(xué)習(xí)或者使用Python具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面來(lái)一起學(xué)習(xí)學(xué)習(xí)吧

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(即使沒(méi)有顯示的繼承object類型),即所有的類都是“新式類”。

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

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

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

經(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)行搜索的過(guò)程中,根據(jù)從下到上的原則,會(huì)優(yōu)先搜索ClassicClassB,而ClassicClassB沒(méi)有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ù)來(lái)查看類的搜索順序(這也算是一個(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é)果相同。

[<class '__main__.SubNewStyleClass'>, <class '__main__.NewStyleClassB'>, <class '__main__.NewStyleClassC'>, <class '__main__.NewStyleClassA'>, <type 'object'>]
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)先:

[<class '__main__.SubNewStyleClass'>, <class '__main__.NewStyleClassB'>, <class '__main__.NewStyleClassA'>, <class '__main__.NewStyleClassC'>, <type 'object'>]
New Style Class A

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

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

在經(jīng)典類中,所有的類都是classobj類型,而類的實(shí)例都是instance類型。類與實(shí)例只有通過(guò)__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,那這樣的比較就毫無(wú)意義。

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

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

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

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

<type 'list'>

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

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

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

總結(jié)

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

相關(guān)文章

  • 使用numpy nonzero 找出非0元素

    使用numpy nonzero 找出非0元素

    這篇文章主要介紹了使用numpy nonzero 找出非0元素的方法,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2021-05-05
  • Python創(chuàng)建字典的八種方式

    Python創(chuàng)建字典的八種方式

    今天小編就為大家分享一篇關(guān)于Python創(chuàng)建字典的八種方式,小編覺得內(nèi)容挺不錯(cuò)的,現(xiàn)在分享給大家,具有很好的參考價(jià)值,需要的朋友一起跟隨小編來(lái)看看吧
    2019-02-02
  • 關(guān)于Python中空格字符串處理的技巧總結(jié)

    關(guān)于Python中空格字符串處理的技巧總結(jié)

    在我們?nèi)粘9ぷ髦薪?jīng)常會(huì)遇到字符串處理,大家應(yīng)該都不陌生,但空格字符串呢?會(huì)不會(huì)就不太熟悉了呢?所以下面這篇文章就來(lái)給大家總結(jié)了關(guān)于Python中空格字符串處理的技巧,需要的朋友可以參考借鑒,下面來(lái)一起看看吧。
    2017-08-08
  • 使用Python對(duì)Dicom文件進(jìn)行讀取與寫入的實(shí)現(xiàn)

    使用Python對(duì)Dicom文件進(jìn)行讀取與寫入的實(shí)現(xiàn)

    這篇文章主要介紹了使用Python對(duì)Dicom文件進(jìn)行讀取與寫入的實(shí)現(xiàn),文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2020-04-04
  • Pyhthon中使用compileall模塊編譯源文件為pyc文件

    Pyhthon中使用compileall模塊編譯源文件為pyc文件

    這篇文章主要介紹了Pyhthon中使用compileall模塊編譯源文件為pyc文件,需要的朋友可以參考下
    2015-04-04
  • Python 統(tǒng)計(jì)位數(shù)為偶數(shù)的數(shù)字代碼詳解

    Python 統(tǒng)計(jì)位數(shù)為偶數(shù)的數(shù)字代碼詳解

    這篇文章主要介紹了Python 統(tǒng)計(jì)位數(shù)為偶數(shù)的數(shù)字,本文通過(guò)實(shí)例代碼給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2020-03-03
  • Python實(shí)現(xiàn)Markdown、富文本和HTML格式之間的轉(zhuǎn)換

    Python實(shí)現(xiàn)Markdown、富文本和HTML格式之間的轉(zhuǎn)換

    要實(shí)現(xiàn)Markdown、富文本(如富文本HTML)和純HTML格式之間的轉(zhuǎn)換,可以使用Python中相關(guān)的庫(kù)來(lái)處理這些格式的解析和轉(zhuǎn)換,下面,我將詳細(xì)介紹如何使用Python實(shí)現(xiàn)Markdown文本格式、富文本格式和HTML格式之間的轉(zhuǎn)換,需要的朋友可以參考下
    2025-01-01
  • 使用Python和NLTK進(jìn)行文本預(yù)處理示例詳解

    使用Python和NLTK進(jìn)行文本預(yù)處理示例詳解

    文將介紹如何使用Python編程語(yǔ)言和NLTK(Natural Language Toolkit)庫(kù)進(jìn)行文本預(yù)處理,為后續(xù)的文本分析和機(jī)器學(xué)習(xí)任務(wù)做準(zhǔn)備,文中有詳細(xì)的代碼示例供大家參考,需要的朋友可以參考下
    2024-03-03
  • python 讀寫、創(chuàng)建 文件的方法(必看)

    python 讀寫、創(chuàng)建 文件的方法(必看)

    下面小編就為大家?guī)?lái)一篇python 讀寫、創(chuàng)建 文件的方法(必看)。小編覺得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧
    2016-09-09
  • 利用Python制作動(dòng)態(tài)排名圖的實(shí)現(xiàn)代碼

    利用Python制作動(dòng)態(tài)排名圖的實(shí)現(xiàn)代碼

    這篇文章主要介紹了利用Python制作動(dòng)態(tài)排名圖的實(shí)現(xiàn)代碼,本文通過(guò)實(shí)例代碼給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2020-04-04

最新評(píng)論

叶城县| 军事| 望城县| 沾益县| 浮梁县| 托克逊县| 合江县| 财经| 中阳县| 绩溪县| 湖南省| 梨树县| 崇礼县| 称多县| 新昌县| 峡江县| 广平县| 京山县| 汉源县| 淮南市| 广安市| 云林县| 资兴市| 贞丰县| 香河县| 扬州市| 汾阳市| 密山市| 谷城县| 和田县| 渭源县| 卓资县| 瑞昌市| 休宁县| 阳城县| 沙田区| 社旗县| 湘潭县| 淮北市| 维西| 犍为县|