单继承下的属性查找

先从自己的对象里找,找不到到产生对象的类里面找,找不到再到继承的父类找

示例如下:

    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中才分新式类与经典类