zoukankan      html  css  js  c++  java
  • 继承,经典类与新式类的MRO,C3算法,super

    #继承
    class JiaoFu:
        def qd(self):
            print("教父带你祈祷")
    class Fu:
        def msj(self):
            print("alex喜欢msj")
    
    class Zi(Fu, JiaoFu):
        def dbj(self):
            print("刘伟喜欢大宝剑")
    
    z = Zi()
    z.msj()
    z.dbj()
    z.qd()
    
    
    class Base1: # Base1 object
        def func(self):
            print("娃哈哈")
    
    
    class Base2:
        def func(self):
            print("雪碧")
    
    class Foo(Base1, Base2): # Foo, Base1, Base2
        pass
    
    f = Base1()
    f.func() # 雪碧, 娃哈哈
    
    #经典类的MRO,深度优先
    class A:
        pass
    
    class B:
        pass
    
    class C:
        pass
    
    class D:
        pass
    
    class E(A, C):
        pass
    
    class F(B, D):
        pass
    
    class G(E, F):
        pass
    
    
    # GEACFBD #
    
    #新式类的MRO,C3算法
    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 G(E):
        pass
    class H(G, F):
        pass
    print(H.__mro__)
    # H的MRO: ??
    # 拆
    # L(H)= H + L(G) + L(F) -> H + (GECA) + (FDBECA) -> HGFDBECA (MRO)
    #
    # # L(G) = G + L(E) -> G +(ECA) -> GECA
    # # L(F) = F + L(D) + L(E) -> F +(DBCA) + (ECA) -> FDBECA
    #
    # # L(E) = E +  L(C) + L(A) -> E + (CA) + A -> ECA
    # # L(D) = D + L(B)+ L(C)  -> D + (BA) + (CA) -> DBCA
    #
    # # L(c) = C + A  CA
    # # L(B) = B + A  BA
    #
    # # L(A) = A
    
    
    
    #实例
    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 N:
        pass
    class O:
        pass
    class M(N, O):
        pass
    class G(E, M):
        pass
    class H(G, F):
        pass
    
    print(H.__mro__)
    
    # H的MRO
    L(H) = H + L(G) + L(F) -> H + (MNO) + () -> H G F D B E C A M N O
    
    L(G) = G + L(E) + L(M)  -> G + (ECA) + (MNO) -> GECAMNO
    L(F) = F + L(D) + L(E)  -> F + (DBCA) + (ECA) -> FDBECA
    
    L(E) = E + (CA) + A -> ECA
    L(M) = M + N + O  -> MNO
    L(D) = D + (BA) + (CA) -> DBCA
    
    H G F D B E C A M N O
    
    # MRO + super ⾯试题
    class Init(object):
        def __init__(self, v):
            print("init")
            self.val = v
    class Add2(Init):
        def __init__(self, val):
            print("Add2")
            super(Add2, self).__init__(val)
            print(self.val)  # 5
            self.val += 2 # 7
    class Mult(Init):
        def __init__(self, val):
            print("Mult")
            super(Mult, self).__init__(val)
            self.val *= 5
    class HaHa(Init):
        def __init__(self, val):
            print("哈哈")
            super(HaHa, self).__init__(val)
            self.val /= 5
    class Pro(Add2,Mult,HaHa): #
        pass
    class Incr(Pro):
        def __init__(self, val):
            super(Incr, self).__init__(val)
            self.val += 1
    
    print(Incr.__mro__)#得到mro继承列表
    # p = Incr(5) # MRO: Incr Pro Add2 Mult HaHa Init # # 一个对象. p : val: 8 # print(p.val) c = Add2(2) # MRO: ADD2 INIT print(c.val)

    class haha(object):pass
    class base(object):pass
    class foo(base,haha):pass
    print(foo.__bases__)#获取当前类的父类返回一个元组(base,haha)
  • 相关阅读:
    SqlLikeAttribute 特性增加 左、右Like实现
    MySql高效分页SQL
    ConcurrentQueue对列的基本使用方式
    第一次
    kubeadm搭建高可用k8s平台(多master)
    prometheus监控
    pyecharts地图中显示地名
    anaconda安装及使用
    Python的pyecharts安装
    安装MY SQL详细步骤
  • 原文地址:https://www.cnblogs.com/PythonMrChu/p/9733684.html
Copyright © 2011-2022 走看看