1. 程式人生 > >day19 Python MRO + super ⾯試題詳解

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