zoukankan      html  css  js  c++  java
  • 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
    

      

  • 相关阅读:
    P12 向量组03--极大线性无关组
    超导体
    Matlab中disp、fprintf和sprintf有什么区别?
    点击word页面自动弹出信息检索很烦人
    Postman 官方中文版 v7.25.3
    无法为更新定位行。一些值可能已在最后一次读取后已更改解决办法
    Everything文件查找工具
    Delphi的DataSource事件
    Delphi中inherited问题
    delphi窗体继承
  • 原文地址:https://www.cnblogs.com/fanghongbo/p/9974776.html
Copyright © 2011-2022 走看看