物件導向 林老師版 繼承的原理(七)

2022-09-15 10:57:11 字數 2122 閱讀 8010

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

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

pass

class bar(foo):

pass

class foo(object):

pass

class bar(foo):

pass

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

class foo():

pass

print(foo.__bases__)

2、輸出

(,)
3、加上object

class foo(object):

pass

print(foo.__bases__)

4、輸出

(,)
在python3中-》新式類:乙個類沒有繼承object類,預設就繼承objectpython到底是如何實現繼承的,對於你定義的每乙個類,python會計算出乙個方法解析順序(mro)列表,這個mro列表就是乙個簡單的所有基類的線性順序列表,例如

>>> f.mro() #等同於f.__mro__

[, , ,

, , , ]

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

子類會先於父類被檢查

多個父類會根據它們在列表中的順序被檢查

如果對下乙個類存在兩個合法的選擇,選擇第乙個父類

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

多繼承情況下,在要查詢屬性不存在時,就會按照深度優先的方式查詢下去

多繼承情況下,在要查詢屬性不存在時,會按照廣度優先的方式查詢下去

print(f.__mro__) #只有新式才有這個屬性可以檢視線性列表,經典類沒有這個屬性

from d

(, , , , , , )

1、新式類繼承順序:f->d->b->e->c->a2、經典類繼承順序:f->d->b->a->e->c3、python3中統一都是新式類 pyhon2中才分新式類與經典類

4、print(f.__mro__) #只有新式才有這個屬性可以檢視線性列表,經典類沒有這個屬性

物件導向 林老師版 屬性查詢(四)

1 產生物件 2 類中的資料屬性 3 類中的函式屬性 4 補充說明 1 實現 x global class luffystudent school luffycity def init self,name,age self.name name self.self.age age def learn ...

物件導向程式設計 多重繼承(七)

1.繼承 繼承 至少兩個類,表達的是什麼是什麼的關係。繼承存在單繼承和多繼承。子類要是沒有 init 就呼叫父類的,子類要是有 init 就呼叫自己的,也可以引用父類的。class animal object def init self,name,aggressivity,life value se...

物件導向。物件的繼承

1.原型繼承 將父類的例項賦值給子類的原型 這就是原型繼承 將父類的私有和公有都繼承在子類的原型上,成為子類的公有屬性。2.call繼承 將父類私有的繼承為子類私有的 3.冒充物件繼承 將父類私有的和公有的都繼承為子類私有的 4.混合繼承 私有的繼承為私有的,公有的和私有的再次繼承為公有的 混合繼承...