在Java和C#中子类只能继承一个父类,而Python中子类可以同时继承多个父类,如A(B,C,D)
如果继承关系为非菱形结构,则会按照先找B这一条分支,然后再找C这一条分支,最后找D这一条分支的顺序直到找到我们想要的属性
如果继承关系为菱形结构,即子类的父类最后继承了同一个类,那么属性的查找方式有两种:
# 继承菱形问题: 新式类和经典类的查找顺序不一样
# 新式类的查找属性:广度优先
# 经典类:深度优先
class G():
a = 'ggg'
class F(G):
a = 'fff'
class E(F):
a = 'eee'
class D(E):
a = 'ddd'
class C(D):
a = 'ccc'
class B(C):
a = 'bbb'
class A(B, C, D):
a = 'aaa'
a = A()
print(a.a)
# mro 列表,查看继承顺利列表(只在新式类中有)
print(A.mro())
print(A.__mro__)
obj = A()
(<class 'object'>,)
obj.test() # A->B->E-C-F-D->G-object
from A
[
python到底是如何实现继承的,对于你定义的每一个类,python会计算出一个方法解析顺序(MRO)列表,这个MRO列表就是一个简单的所有基类的线性顺序列表,如:
print(A.mro()) # A.__mro__
[<class ‘main.A‘>, <class ‘main.B‘>, <class ‘main.E‘>, <class ‘main.C‘>, <class ‘main.F‘>, <class ‘main.D‘>, <class ‘main.G‘>, <class ‘object‘>]
for i in A.mro():
print(i)
<class '__main__.A'>
<class '__main__.B'>
<class '__main__.E'>
<class '__main__.C'>
<class '__main__.F'>
<class '__main__.D'>
<class '__main__.G'>
<class 'object'>
为了实现继承,python会在MRO列表上从左到右开始查找基类,直到找到第一个匹配这个属性的类为止。
而这个MRO列表的构造是通过一个C3线性化算法来实现的。我们不去深究这个算法的数学原理,它实际上就是合并所有父类的MRO列表并遵循如下三条准则:
原文:https://www.cnblogs.com/randysun/p/12249192.html