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

  

猜你喜欢

转载自www.cnblogs.com/fanghongbo/p/9974776.html