目录python
继承了object的类以及该类的子类,都是新式类算法
Python3中全部的类都是新式类3d
没有继承object的类以及该类的子类,都是经典类code
只有Python2中才有经典类blog
在Java和C#中子类只能继承一个父类,而Python中子类能够同时继承多个父类,如A(B,C,D)继承
若是继承关系为非菱形结构,则会按照先找B这一条分支,而后再找C这一条分支,最后找D这一条分支的顺序直到找到咱们想要的属性数学
若是继承关系为菱形结构,即子类的父类最后继承了同一个类,那么属性的查找方式有两种:it
广度优先:广度优先class
经典类:一条路走到黑,深度优先test
class G(object): # def test(self): # print('from G') pass print(G.__bases__) class E(G): # def test(self): # print('from E') 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 D(G): # def test(self): # print('from D') pass class A(B, C, D): def test(self): print('from A') 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列表并遵循以下三条准则: