mro
mro是每一个类会把它所有的父类和自己做一个线性化serialization,也就是把所有的继承类和自己做一个排队,这个排队要保证自己是最高优先级。
1 2 3 4 5 6 7 8 9
| class A: def say(self): print("A") class B: def say(self): print("B")
|
1 2 3 4 5 6 7 8 9
| class M(A, B): pass
m = M() m.say()
|
1 2 3 4 5 6 7 8 9 10 11 12 13
| class C(A): pass
class M(C,B): pass
m = M() m.say()
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22
| class C(A): pass
class D(A): def say(self): print("D")
class M(C,D): pass
m = M() m.say()
|
1 2 3 4 5 6 7 8 9 10 11 12 13
| class C(A, B): pass
class D(B, A): pass
class M(C, D): pass
|
总结:
- 每个类只会按排列好的类的优先级去执行自己类里面的函数,若B继承A,B里面没有say函数而A里面有,那么即使B的优先级高,B也不能执行say函数,只能优先级到A时,自己调用自己类里的say函数;
- 当存在多继承时,在当前类的继承关系中先出现的类的优先级高(情况1);
- 当存在A被多个类继承时,A的优先级由最后一次出现的位置决定(情况3);
super
1 2 3 4 5
| super(class, object/class).__init__([参数])
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19
| class A: def __init__(self, name): self.name = name
class B(A): def __init__(self, name, age): self.age = age super(B, self).__init__(name)
c = B('xiaoming',16) print(c.name) print(c.age)
|
self
在类内用类名和self的区别