欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

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

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

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

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

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

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

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

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

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

對(duì)經(jīng)典類(lèi)進(jìn)行代碼驗(yàn)證(所有經(jīng)典類(lèi)的代碼必須在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的超類(lèi)ClassicClassA,在ClassicClassA中發(fā)現(xiàn)var屬性后停止搜索,var的值為ClassicClassA中var的值;而ClassicClassC的var屬性從始至終都未被搜索到。

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

Classic Class A 

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

對(duì)新式類(lèi)的繼承搜索順序進(jìn)行代碼驗(yàn)證,新式類(lèi)中,可以使用mro函數(shù)來(lái)查看類(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

但是不代表新式類(lèi)的繼承順序就是廣度優(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

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

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

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

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)為T(mén)rue,那這樣的比較就毫無(wú)意義。

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

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

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

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

<type 'list'>

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

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

更詳細(xì)的:http://www.dbjr.com.cn/article/165048.htm

總結(jié)

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

相關(guān)文章

  • 基于Python實(shí)現(xiàn)圖片瀏覽器的應(yīng)用程序

    基于Python實(shí)現(xiàn)圖片瀏覽器的應(yīng)用程序

    圖像瀏覽器應(yīng)用程序是一種非常常見(jiàn)和實(shí)用的工具,這篇文章就來(lái)為大家介紹一下如何使用Python編程語(yǔ)言和wxPython庫(kù)創(chuàng)建一個(gè)簡(jiǎn)單的圖像瀏覽器應(yīng)用程序,感興趣的可以了解下
    2023-10-10
  • python自動(dòng)截取需要區(qū)域,進(jìn)行圖像識(shí)別的方法

    python自動(dòng)截取需要區(qū)域,進(jìn)行圖像識(shí)別的方法

    今天小編就為大家分享一篇python自動(dòng)截取需要區(qū)域,進(jìn)行圖像識(shí)別的方法,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧
    2018-05-05
  • Python實(shí)現(xiàn)的基數(shù)排序算法原理與用法實(shí)例分析

    Python實(shí)現(xiàn)的基數(shù)排序算法原理與用法實(shí)例分析

    這篇文章主要介紹了Python實(shí)現(xiàn)的基數(shù)排序算法,簡(jiǎn)單說(shuō)明了基數(shù)排序的原理并結(jié)合實(shí)例形式分析了Python實(shí)現(xiàn)與使用基數(shù)排序的具體操作技巧,需要的朋友可以參考下
    2017-11-11
  • Python中的兩個(gè)內(nèi)置模塊介紹

    Python中的兩個(gè)內(nèi)置模塊介紹

    這篇文章主要介紹了Python中的兩個(gè)內(nèi)置模塊介紹,本文講解Python啟動(dòng)后默認(rèn)會(huì)加載的兩個(gè)內(nèi)建模塊,需要的朋友可以參考下
    2015-04-04
  • 我喜歡你 抖音表白程序python版

    我喜歡你 抖音表白程序python版

    我喜歡你!這篇文章主要為大家詳細(xì)介紹了抖音表白程序python版的實(shí)現(xiàn)方法,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2019-04-04
  • Python實(shí)現(xiàn)通過(guò)解析域名獲取ip地址的方法分析

    Python實(shí)現(xiàn)通過(guò)解析域名獲取ip地址的方法分析

    這篇文章主要介紹了Python實(shí)現(xiàn)通過(guò)解析域名獲取ip地址的方法,結(jié)合實(shí)例形式總結(jié)分析了兩種比較常見(jiàn)的解析域名對(duì)應(yīng)IP地址相關(guān)操作技巧,需要的朋友可以參考下
    2019-05-05
  • python3 實(shí)現(xiàn)的人人影視網(wǎng)站自動(dòng)簽到

    python3 實(shí)現(xiàn)的人人影視網(wǎng)站自動(dòng)簽到

    這里給大家分享的是使用Python3結(jié)合計(jì)劃任務(wù),實(shí)現(xiàn)的人人影視網(wǎng)站自動(dòng)簽到功能的代碼,非常的實(shí)用,有需要的小伙伴可以參考下
    2016-06-06
  • python輸入錯(cuò)誤后刪除的方法

    python輸入錯(cuò)誤后刪除的方法

    在本篇文章里小編給讀者們整理了關(guān)于python輸入錯(cuò)誤后刪除的方法以及相關(guān)知識(shí)點(diǎn),有興趣的朋友們學(xué)習(xí)下。
    2019-10-10
  • Python tkinter制作單機(jī)五子棋游戲

    Python tkinter制作單機(jī)五子棋游戲

    這篇文章主要介紹了Python tkinter制作單機(jī)五子棋游戲,本文通過(guò)實(shí)例代碼給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2020-09-09
  • Tensorflow2.1 完成權(quán)重或模型的保存和加載

    Tensorflow2.1 完成權(quán)重或模型的保存和加載

    這篇文章主要為大家介紹了Tensorflow2.1 完成權(quán)重或模型的保存和加載,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2022-11-11

最新評(píng)論