day19 Python MRO + super ⾯试题详解
# 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