python面向物件的繼承下的屬性查詢
阿新 • • 發佈:2021-07-14
單繼承下的屬性查詢
先從自己的物件裡找,找不到到產生物件的類裡面找,找不到再到繼承的父類找
示例如下:
class Foo: def f1(self): print("Foo.f1") def f2(self): print("Foo.f2") self.f1() # self => obj class Bar(Foo): def f1(self): print("Bar.f1") obj = Bar() obj.f2() 先列印Foo.f2再列印bar.f1,因為物件是子類的會先從子類裡找 class Foo: def __f1(self): # _Foo__f1() print("Foo.f1") def f2(self): print("Foo.f2") self.__f1() # self._Foo__f1() class Bar(Foo): def __f1(self): # _Bar__f1() print("Bar.f1") obj = Bar() obj.f2() 先列印Foo.f2再列印Foo.f1,隱藏屬性將變數名變形成了,_類名__變數名,這就明確了
多繼承下的屬性查詢
非菱形繼承:則會按照先找B這一條分支,然後再找C這一條分支,最後找D這一條分支的順序直到找到我們想要的屬性
菱形繼承:1.新式類:廣度優先查詢
2.經典類:深度優先查詢
class G: def test(self): print('from G') class E(G): # def test(self): # print('from E') pass class D(G): # def test(self): # print('from D') pass class B(E): # def test(self): # print('from B') pass class F(G): # def test(self): # print('from F') pass class C(F): # def test(self): # print('from C') pass class A(B, C, D): # def test(self): # print('from A') pass f1 = A() f1.test() print(A.__mro__) # 只有新式才有這個屬性可以檢視線性列表,經典類沒有這個屬性 新式類繼承順序:A->B->E->C->F->D->G 經典類繼承順序:A->B->E->G->C->F->D python3中統一都是新式類 pyhon2中才分新式類與經典類