12.4 菱形继承问题(了解)
1.经典类和新式类
新式类:在python中会默认继承object类,只要继承了object类的就是新式类,python3中所有类都是新式类。
经典类:没有继承object的就是经典类,只有python2中有经典类。
2.菱形继承问题
当继承为菱形继承的时候经典类和新式类搜索某一个属性的顺序会不一样。
class G:def test(self):print('from G')class E(G):# def test(self):# print('from E')passclass F(G):# def test(self):# print('from F')passclass B(E):# def test(self):# print('from B')passclass C(F):# def test(self):# print('from C')pass
class D(G):# def test(self):# print('from D')passclass A(B,C,D):# def test(self):# print('from A')passa=A()
a.test() #搜索路径(广度优先查找),A(B,C,D).test->B(E).test()->E(G).test()#->C(F).test()->F(G).test()#->D(G).test()--------------->G.test()# print(A.__mro__) #打印新式类查找顺序
for i in A.__mro__:print(i)
from G
<class '__main__.A'>
<class '__main__.B'>
<class '__main__.E'>
<class '__main__.C'>
<class '__main__.F'>
<class '__main__.D'>
<class '__main__.G'>
<class 'object'>
总结:
- 在新式类中当遇到菱形继承时候,会以广度优先查找
- 在经典类中当遇到菱形继承时候,会以深度优先查找(了解)
- 普通继承:正常顺序查找。