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

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

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

1.新式類與經典類

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

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

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

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

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

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

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

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

Classic Class A 

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

對新式類的繼承搜索順序進行代碼驗證,新式類中,可以使用mro函數(shù)來查看類的搜索順序(這也算是一個區(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ōu)先預期結果相同。

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

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

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

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

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

在經典類中,所有的類都是classobj類型,而類的實例都是instance類型。類與實例只有通過__class__屬性進行關聯(lián)。這樣在判斷實例類型時,就會造成不便:所有的實例都是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類型,而內置類的實例卻不是,無法統(tǒng)一。

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

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

運行結果,是list類型

<type 'list'>

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

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

更詳細的:http://m.fzitv.net/article/165048.htm

總結

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

相關文章

  • 使用numpy nonzero 找出非0元素

    使用numpy nonzero 找出非0元素

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

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

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

    關于Python中空格字符串處理的技巧總結

    在我們日常工作中經常會遇到字符串處理,大家應該都不陌生,但空格字符串呢?會不會就不太熟悉了呢?所以下面這篇文章就來給大家總結了關于Python中空格字符串處理的技巧,需要的朋友可以參考借鑒,下面來一起看看吧。
    2017-08-08
  • 使用Python對Dicom文件進行讀取與寫入的實現(xiàn)

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

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

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

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

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

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

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

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

    使用Python和NLTK進行文本預處理示例詳解

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

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

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

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

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

最新評論

安泽县| 本溪市| 三穗县| 巨野县| 台湾省| 巨鹿县| 宜兰县| 蓝田县| 堆龙德庆县| 浮山县| 定兴县| 阿图什市| 堆龙德庆县| 双江| 涞源县| 吉木萨尔县| 遵化市| 镇原县| 博白县| 旌德县| 凌海市| 潮州市| 阿拉善左旗| 五台县| 大邑县| 黔东| 阳谷县| 开鲁县| 镇远县| 永春县| 宝坻区| 磐安县| 泸西县| 象山县| 新邵县| 泽库县| 肃宁县| 嫩江县| 仁化县| 广元市| 九龙县|