zoukankan      html  css  js  c++  java
  • day20-2018-11-13多继承

    class Shen:
        def fly(self):
            print("大神会飞")
    class Hou:
        def chi(self):
            print("猴子吃桃子")
    
    class SunWuKong(Shen, Hou): # 一个类可以继承多个无关的类. 一个类可以被多个无关的类继承
        pass
    
    class TaiShangLaoJun(Shen):
        pass
    #
    # swk = SunWuKong()
    # swk.fly()
    # swk.chi()
    
    
    # 经典类. 在python2.2之前. 已经是历史了. MRO 采用的是树形结构的深度递归遍历(一条道跑到黑)
    # 新式类  在2.2之后产生新式类.  目前我们使用的. 所有的类的根都是object C3算法(merge)
    class A:
        pass
    
    class B(A):
        pass
    
    class C(A):
        pass
    
    class D(B, C):
        pass
    
    class E:
        pass
    
    class F(D, E):
        pass
    
    class G(F, D):
         pass
    
    class H:
        pass
    
    class Foo(H, G):
        pass
    class A:
        pass
    class B(A):
        pass
    class C(A):
        pass
    class D(B, C):
        pass
    class E(C, A):
        pass
    class F(D, E):
        pass
    class M(F, E):
        pass
    class N:
        pass
    class P(M,N):
        pass
    class G(P):
        pass
    class O:
        pass
    class H(G, F):
        pass
    print(H.__mro__)
    '''
    L(H) = H + L(G) + X+ L(F)        HGPMFDBECAN FDBECA
    
    L(G) = G + L(P)  GPMFDBECAN
    L(F) = F + L(D) + L(E)  FDBECA
    
    L(P) = P + L(M) + L(N)  PMFDBECAN
    L(D) = D + L(B) + L(C)  DBCA
    L(E) = E + L(C) + L(A)  ECA
    
    L(M) = M + L(F) + L(E)  MFDBECA
    L(N) = N
    L(B) = B + L(A)   BA
    L(C) = C + L(A)   CA
    
    L(A) = A
    '''
    
    
    '''
    设L为查找方法的MRO顺序
    L(H) = H + L(G) + L(F)
    L(G) = G + L(E)
    L(F) = F + L(D) + L(E)
    L(D) = D + L(B) + L(C)
    L(B) = B + L(A)
    L(E) = E + L(C) + L(A)
    L(C) = C + L(A)
    L(A) = A
    
    
    合并. 从下向上合并. 拿出每一项的头和后一项的身体进行比较. 如果出现了. 就过, 从后一项的头继续去比较. 如果不出现就出来
    
    HGFDBECA
    
    L(H) = H + L(G) + L(F)   ECA + FDBECA   
    L(G) = G + L(E)  GECA
    L(F) = F + L(D) + L(E)   FDBECA
    L(D) = D + L(B) + L(C)   DBCA
    L(B) = B + L(A)            BA
    L(E) = E + L(C) + L(A)    ECA
    L(C) = C + A   CA
    L(A) = A
    
    新式类通过__mro__可以直接看到MRO的结果
    '''
    # HGF   DBE    CA  object
    # print(H.__mro__)
    
    # 给面试官用的.
    # super是查找mro顺序中的下一个
    # 单继承中我们可以认为super是对父类中的属性或方法的引入
    
    class ShengWu:
        def dong(self): # 实例方法
            print(self)
            print("我是生物")
    
    class Animal(ShengWu):
       pass
    
    class Cat(Animal):
        def dong(self): # 子类中出现了和父类重名的内容. 表示对父类的方法的覆盖(重写). 半盖(java)
            super(Animal, self).dong() # 定位到Animal. 找Animal的下一个
            # super(类, 对象).方法()  找到MRO中的类. 找这个类的下一个. 去执行方法
            print("我的猫也会动")
    
    # 找MRO中的下一个
    # Cat -> Animal -> ShengWu
    
    c = Cat()
    print(c)
    c.dong()
    
    
    
    
    # MRO + super ⾯试题
    class Init(object):
        def __init__(self, v):
            print("init")
            self.val = v # 2
    class Add2(Init):
        def __init__(self, val): # 2
            print("Add2")
            super(Add2, self).__init__(val)
            print(self.val) # 5.0
            self.val += 2 # 7.0
    class Mult(Init):
        def __init__(self, val):
            print("Mult")
            super(Mult, self).__init__(val)
            self.val *= 5 # 5.0
    class HaHa(Init):
        def __init__(self, val):
            print("哈哈")
            super(HaHa, self).__init__(val)
            self.val /= 5   # 1.0
    class Pro(Add2,Mult,HaHa): #
        pass
    class Incr(Pro):
        def __init__(self, val): # 5
            super(Incr, self).__init__(val)
            self.val += 1 # 8.0
    
            '''
            add2
            Mult
            哈哈
            init
            5.0
            8.0
            Add2
            init
            2
            4
            
            '''
    
    # Incr, pro, add2, mult, haha, Init
    p = Incr(5)
    print(p.val) # ?
    # Add2 init
    c = Add2(2)
    print(c.val) # ?
  • 相关阅读:
    restframwork框架
    restful规范
    python_微信 跳一跳
    项目经历1
    python3.6+GDAL-2.1.3环境配置
    OpenCV&&python_图像平滑(Smoothing Images)
    opencv python3.6安装和测试
    python_机器学习—sklearn_win_64-3.6安装&&测试
    python安装 numpy&安装matplotlib& scipy
    自动出题判分——c#学习实践
  • 原文地址:https://www.cnblogs.com/VastTry/p/9954017.html
Copyright © 2011-2022 走看看