Python 中的新式/經(jīng)典類

Python 新式/經(jīng)典類

  1. 新式/經(jīng)典類的區(qū)別

    從Python2.2開始,Python 引入了 new style class(新式類)新式類, 這里簡單的說一下相對于經(jīng)典類, 新式類的區(qū)別.

    下面直接上代碼:

# -*- coding:utf-8 -*-


class old_class:  # 經(jīng)典類
    pass


class new_class:  # 新式類
    pass


old = old_class()
new = new_class()

print '經(jīng)典類'
print old
print type(old)
print old.__class__
print dir(old)

print "新式類"
print new
print new.__class__
print dir(new)
print type(new)

在python2.7環(huán)境下查看一下輸出

經(jīng)典類
<__main__.old_class instance at 0x10e14ccb0>
<type 'instance'>
__main__.old_class
['__doc__', '__module__']
新式類
<__main__.new_class object at 0x10e12d410>
<class '__main__.new_class'>
['__class__', '__delattr__', '__dict__', '__doc__', '__format__', '__getattribute__', '__hash__', '__init__', '__module__', '__new__', '__reduce__', '__reduce_ex__', '__repr__', '__setattr__', '__sizeof__', '__str__', '__subclasshook__', '__weakref__']
<class '__main__.new_class'>

區(qū)別已經(jīng)很明顯了, 除去類型不同之外,新式類多出了許多內(nèi)置方法. 這里就不贅述用法了.

還有一個重要的區(qū)別在于, 新式類和經(jīng)典類對方法查找方式有區(qū)別. 我們稱之為廣度優(yōu)先和深度優(yōu)先. 但很多人會誤會這句話的意思.

我們來看一個例子:

Xnip2018-05-24_23-50-08.png

大家可能會理解為這種查找方式, 但是實際上, 不是的, 如果方法沒找到的情況下, 且只有一個條繼承的路線, 那么就會沿著這條路線繼續(xù)向上找. 說的有點暈乎, 我們看例子:

Xnip2018-05-24_23-57-33.png

這里我們可以這么理解, E 繼承自B, C, D 而B, C, D又同時繼承自A, 所以查找的思路是這樣的.

  • E 首先找到B, 發(fā)現(xiàn)B 與C, D共享A, 就不再向上找, 橫向查找.
  • E 于是找到了C, 發(fā)現(xiàn) C 與 D共享A, 于是也不再向上找, 又開始橫向查找
  • E 再找到了D, 此時只有D這么最后一根線連著A了, 便開始沿著D的繼承關(guān)系, 找到了A

如果到這里, 你已經(jīng)明白了, 可以嘗試著看看這題:

Xnip2018-05-25_00-03-29.png

下面是這道題的答案, 在分析一下

  1. A先找到B, B繼承自E且只有B繼承自E, 所以找E , 同理發(fā)現(xiàn)E繼承且只有E繼承自H , 于是找H , 再找到J
  2. 再開始找C ,發(fā)現(xiàn)C繼承且僅有C繼承自F, 于是開始找F, 開始找F, 發(fā)現(xiàn)F與I共同繼承自K, 于是放棄向上找
  3. 開始找D, D上與之前類似, 都是繼承且僅僅只有一個繼承關(guān)系, 一直到I, 發(fā)現(xiàn)除去剛剛找過的F之外, 已經(jīng)沒有其他類繼承自K了, 于是I就向上走, 找到K
Xnip2018-05-25_00-03-11.png

再來試試

Xnip2018-05-25_00-12-57.png

又是答案..

Xnip2018-05-25_00-12-45.png

如果到這里, 你都對了, 那么新式類的方法查找路徑你就理解了.

現(xiàn)在再來說說經(jīng)典類. 就是一句話, 只要有爹就一路向上走.

我們按照經(jīng)典類的方法查找路徑去寫寫剛剛這道題.

這里給出答案 A B C E F G D E F G.

總結(jié)一下方法查找的區(qū)別:

經(jīng)典類: 只要有父類, 就會沿著一直找, 即使已經(jīng)找過了~

新式類: 在類繼承的多個類擁有共同父類的情況下, 會優(yōu)先橫向查找, 直到剩下最后一個繼承自這個共同父類的對象, 再向上查找.

如果我上面的理解有錯誤的話, 希望大家指出, 謝謝!

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容