面向对象--多继承的C3算法

 在python3的面向对象中,最底层的父类都默认继承Object类,所有的类都是新式类,多继承的继承顺序遵循广度优先规则,也就是C3算法.

C3算法就是 计算继承顺序时,先把要计算的子类名拿出来,在加上继承的父类的继承顺序

 

从左往右找第一个继承的父类继承顺序,这样会出现3中情况:

  1.第一位出现的父类名,并且在后面没有出现的提出来

  2.第一位出现的父类在后面出现并且也都是在第一位,那也可以提出来

  3.第一位出现的父类在后面出现但是不在第一位,那么我们就要找第二个继承的父类继承顺序,看他的第一位的父类名是什么

 

咱们先看一个简单的了解一下

 

1 class A:
2     pass
3 class B(A):
4     pass
5 class C(A):
6     pass
7 class D(B, C):
8     pass
简单的C3模型

 

 

 1 L(A) = [A] + [O]
 2    A = [O]
 3       = AO
 4 
 5 L(B) = [B] + [AO]
 6    B = [AO]
 7   BA = [O]
 8      =BAO
 9 
10 L(C) =[C]+[AO]
11    C = [AO]
12   CA = [O]
13      =CAO
14 
15 L(D) = [D] + [BAO] + [CAO]
16    D = [BAO] + [CAO]
17   DB = [AO] + [CAO]
18   DB = [AO] + [CAO]
19  DBC = [AO] + [AO]
20 DBCA = [O] + [O]
21      =DBCAO
推倒过程

 

 

 好了,大家是不是对C3算法有了一点了解了呢?像这道题,我们可以看出来,A是B和C 共同继承的父类,走到B这里,发现C的继承顺序中还有A,所以我们需要先继承C才能继承A.

准备好了吗?那么让我们来看一个复杂的吧

嘿嘿,就复杂一点点

 1 class A:
 2     pass
 3 class B(A):
 4     pass
 5 class C(A):
 6     pass
 7 class D(B, C):
 8     pass
 9 class E(C, A):
10     pass
11 class F(D, E):
12     pass
13 class X:
14     pass
15 class Y:
16     pass
17 class M(X, Y):
18     pass
19 class G(E, M):
20     pass
21 class H(G, F):
22     pass
先看看题

为你们准备好了图片,先继承左边箭头指出的父类哦~

 

 1 L(A) = [A] + [O]
 2    A = [O]
 3       = AO
 4 
 5 L(X) = [X] + [O]
 6    X = [O]
 7      = XO
 8 
 9 L(Y) = [Y]+[O]
10    Y = [O]
11      = YO
12 
13 L(B) = [B] + [AO]
14    B = [AO]
15   BA = [O]
16      =BAO
17 
18 L(C) =[C]+[AO]
19    C = [AO]
20   CA = [O]
21      =CAO
22 
23 L(D) = [D] + [BAO] + [CAO]
24    D = [BAO] + [CAO]
25   DB = [AO] + [CAO]
26   DB = [AO] + [CAO]
27  DBC = [AO] + [AO]
28 DBCA = [O] + [O]
29      =DBCAO
30 
31 L(E)  = [E] + [CAO]+[AO]
32     E = [CAO]+[AO]
33    EC = [AO]+[AO]
34   ECA = [O]+[O]
35       =ECAO
36 
37 L(F)   = [F]+[DBCAO]+[ECAO]
38      F = [DBCAO]+[ECAO]
39     FD = [BCAO]+[ECAO]
40    FDB = [CAO]+[ECAO]
41   FDBE = [CAO]+[CAO]
42  FDBEC = [AO]+[AO]
43 FDBECA = [O]+[O]
44        =FDBECAO
45 
46 L(M) = [M] + [XO] + [YO]
47    M = [XO] + [YO]
48   MX = [O] + [YO]
49  MXY = [O] + [O]
50      = MXYO
51 
52 L(G)     = [G] + [ECAO] + [MXYO]
53       G = [ECAO] + [MXYO]
54      GE = [CAO] + [MXYO]
55     GEC = [AO] + [MXYO]
56    GECA = [O] + [MXYO]
57   GECAM = [O] + [XYO]
58  GECAMX = [O] + [YO]
59 GECAMXY = [O] + [O]
60         =GECAMXYO
61 
62 L(H)        = [H] + [GECAMXYO] + [FDBECAO]
63           H = [GECAMXYO] + [FDBECAO]
64          HG = [ECAMXYO] + [FDBECAO]
65         HGF = [ECAMXYO] + [DBECAO]
66        HGFD = [ECAMXYO] + [BECAO]
67       HGFDB = [ECAMXYO] + [ECAO]
68      HGFDBE = [CAMXYO] + [CAO]
69     HGFDBEC = [AMXYO] + [AO]
70    HGFDBECA = [MXYO] + [O]
71   HGFDBECAM = [XYO] + [O]
72  HGFDBECAMX = [YO] + [O]
73 HGFDBECAMXY = [O] + [O]
74             =HGFDBECAMXYO
推倒过程

 

是不是有点好看.....看着这么复杂,但是若是你会了C3算法,是不是觉得就是字多了点,一点难度都没有呢?

那么,,我来教大家一个看继承顺序的小窍门

吃头疼片..







当然不是了,python为我们准备了__mro__方法
print(H.__mro__)就可以查看刚才那个'有点复杂'继承顺序了
小窍门

 

 

答案就是

[<class '__main__.H'>, <class '__main__.G'>, <class '__main__.F'>, <class '__main__.D'>, <class '__main__.B'>, <class '__main__.E'>, <class '__main__.C'>, <class '__main__.A'>, <class '__main__.M'>, <class '__main__.X'>, <class '__main__.Y'>, <class 'object'>]

 

是不是和咱们计算的一样呢?嘿嘿

 

转载于:https://www.cnblogs.com/chenzhiming/p/10009876.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值