继承,经典类与新式类的MRO,C3算法,super
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 | #继承 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)