继承,经典类与新式类的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 + -> 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)
复制代码

 

posted @   冒蓝火的加特林哒哒哒  阅读(206)  评论(0)    收藏  举报
点击右上角即可分享
微信分享提示