python2中才有经典类,没有继承object的类都是经典类。
python3中都是新式类,继承object类的都是新式类,py3中默认继承object类。
Python3中的继承
钻石继承
1 2 3 4 5 6
| graph TD A-->|B继承A| B A-->|C继承A| C B-->|D继承B| D C-->|D继承B| D F[钻石继承]
|
1 2 3 4 5 6 7 8 9 10
| class A: def h(self):print('a') class B(A): def h(self):print('b') class C(A): def h(self):print('c') class D(B,C): def h(self):print('d') d = D() d.h()
|
| A |
B(A) |
C(A) |
D(C,B) |
输出 |
| 有 |
有 |
有 |
有 |
D |
| 有 |
有 |
有 |
无 |
C |
| 有 |
有 |
无 |
无 |
B |
| 有 |
无 |
无 |
无 |
A |
U型继承
1 2 3 4 5 6
| graph TD A-->|B继承A| B E-->|C继承E| C B-->|D继承B| D C-->|D继承B| D F[U型]
|
继承顺序:B–>A–>C–>E
1 2 3 4 5 6 7 8
| graph TD F-->|A继承F| A F-->|E继承F| E A-->|B继承A| B E-->|C继承E| C B-->|D继承B| D C-->|D继承B| D G[乌龟继承]
|
继承顺序:B–>A–>C—>E–>F
可以通过mro()来实现查看继承顺序,继承顺序遵循的是广度优先算法
Python2中的继承
继承顺序遵循的是深度优先算法(从左向右查找,一条分支找到底,若果没找到就去另一条分支继续找)
1 2 3 4 5 6 7 8
| graph TD F-->|A继承F| A F-->|E继承F| E A-->|B继承A| B E-->|C继承E| C B-->|D继承B| D C-->|D继承B| D G[乌龟继承]
|
继承顺序:B–>A–>F—>C–>E
补充
super() 只存在于Python3当中‘
mro() 只存在与新式类