奇怪的继承

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() 只存在与新式类

作者

六记

发布于

2020-11-20

更新于

2024-01-20

许可协议

评论