1. 程式人生 > >面向物件【林老師版】:繼承的原理(五)

面向物件【林老師版】:繼承的原理(五)

一、經典類

經典類:沒有繼承object的類,以及它的子類都稱之為經典類

1、python2.x

在python2中-》經典類:沒有繼承object的類,以及它的子類都稱之為經典類
class Foo:
    pass

class Bar(Foo):
    pass

二、新式類

1、python2.x

class Foo(object):
    pass

class Bar(Foo):
    pass

在python2中-》新式類:繼承object的類,以及它的子類都稱之為新式類

2、python3.x

1、程式碼

class Foo():
    pass
print(Foo.__bases__)

2、輸出

(<class 'object'>,) 

3、加上object

class Foo(object):
    pass
print(Foo.__bases__)

4、輸出

(<class 'object'>,)

在python3中-》新式類:一個類沒有繼承object類,預設就繼承object 

三、python到底是如何實現繼承的

python到底是如何實現繼承的,對於你定義的每一個類,python會計算出一個方法解析順序(MRO)列表,這個MRO列表就是一個簡單的所有基類的線性順序列表,例如

>>> F.mro() #等同於F.__mro__
[<class '__main__.F'>, <class '__main__.D'>, <class '__main__.B'>, 
<class '__main__.E'>, <class '__main__.C'>, <class '__main__.A'>, <class 'object'>]

為了實現繼承,python會在MRO列表上從左到右開始查詢基類,直到找到第一個匹配這個屬性的類為止。而這個MRO列表的構造是通過一個C3線性化演算法來實現的。我們不去深究這個演算法的數學原理,它實際上就是合併所有父類的MRO列表並遵循如下三條準則:

  1. 子類會先於父類被檢查
  2. 多個父類會根據它們在列表中的順序被檢查
  3. 如果對下一個類存在兩個合法的選擇,選擇第一個父類

在Java和C#中子類只能繼承一個父類,而Python中子類可以同時繼承多個父類,如果繼承了多個父類,那麼屬性的查詢方式有兩種,分別是:深度優先和廣度優先

四、當類是經典類時