day19 Python MRO + super ⾯試題詳解
阿新 • • 發佈:2018-11-17
# 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