1. 程式人生 > 其它 >python面向物件的繼承下的屬性查詢

python面向物件的繼承下的屬性查詢

單繼承下的屬性查詢

先從自己的物件裡找,找不到到產生物件的類裡面找,找不到再到繼承的父類找
示例如下:

    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中才分新式類與經典類