# MRO + super ⾯试题
class Init(object):
def __init__(self, v):
print("init") # 12、打印 "init"
self.val = v # 13 、开始赋值 self.val = 5 执行完成,返回到上一次调用的地方
class Add2(Init):
def __init__(self, val):
print("Add2") # 6、 打印 "Add2"
super(Add2, self).__init__(val) # 7 # 执行父类的 .__init__(val) 根据MRO算法,父类是 Mult
print(self.val) # 16 self.val = 5.0 打印 5.0 ,返回到上一次调用
self.val += 2 # 17、self.val = 7.0 ,返回上一次调用
class Mult(Init):
def __init__(self, val):
print("Mult") # 8、 打印"Mult"
super(Mult, self).__init__(val) # 9 、 执行父类的 .__init__(val) 根据MRO算法,父类是 HaHa
self.val *= 5 # 15、 self.val = 1.0 执行 self.val *= 5 之后 self.val = 5.0 ,返回到上一次调用
class HaHa(Init):
def __init__(self, val):
print("哈哈") # 10、打印 "哈哈"
super(HaHa, self).__init__(val) # 11、执行父类的 .__init__(val) 根据MRO算法,父类是 Init
self.val /= 5 # 14、此时self.val 所以 self.val /= 5 之后 self.val = 1.0 ,返回到上一次调用
class Pro(Add2,Mult,HaHa): # 5、 Pro类没有__init__(val) --> 所以继续找父类 Add2
pass # 18、没有调用,继续返回上一次调用
class Incr(Pro):
def __init__(self, val):
super(Incr, self).__init__(val) """ 4、 按照 MRO 顺序: Icar + Pro + Add2 + Mult + HaHa + Init \
执行super(Incr, self).__init__(val) --> 执行到了Pro类 \
"""
self.val += 1 # 19 、self.val = 8.0
# Incr Pro Add2 Mult HaHa Init
p = Incr(5)
print(p.val) # 20 、打印 8.0
"""
# 我们设C3算法是L(x) , 即给出x类. 找到x的MRO :
a). L(Incr) = Icar + L(Pro) + (Pro,) # Incr的MRO顺序是 = Incr --> 父类Pro的MRO --> 父类的集合,简写成L (Incr) = Icar + L(Pro) + (Pro,)
b). L(Pro) = Pro + L(Add2) + L(Mult) + L(HaHa) + (Add2,Mult,HaHa)
c). L(Add2) = Add2 + L(Init) + (Init,)
d). L(Mult) = Mult + L(Init) + (Init,)
e). L(HaHa) = HaHa + L(Init) + (Init,)
# 2、替换
a). L(HaHa) = HaHa + L(Init) + (Init,) --> (HaHa, Init)
b). L(Add2) = Add2 + L(Init) + (Init,) --> (Add2, Init)
c). L(Mult) = Mult + L(Init) + (Init,) --> (Mult, Init)
d). L(Pro) = Pro + L(Add2) + L(Mult) + L(HaHa) + (Add2,Mult,HaHa) --> \
(Pro) + (Add2, Init) + (Mult, Init) + (HaHa, Init) + (Add2,Mult,HaHa) --> \
Pro + Add2 + Mult + HaHa + Init \
e). L(Incr) = Icar + L(Pro) + (Pro,) --> Icar + (Pro + Add2 + Mult + HaHa + Init ) + (Pro,) --> \
Icar + Pro + Add2 + Mult + HaHa + Init \
# 3、得到Icar 最终的MRO继承顺序为:
Icar + Pro + Add2 + Mult + HaHa + Init
"""
# 21 、继续计算下面的调用,先计算Add2的MRO算法,因为Add2直接继承了Init,所以查找顺序就是本身Add2 --> Init; 后面就比较简单了
c = Add2(2)
print(c.val) # 4.0