面向对象--多继承的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

时间: 2024-11-05 21:49:32

面向对象--多继承的C3算法的相关文章

Python新式类继承的C3算法

在Python的新式类中,方法解析顺序并非是广度优先的算法,而是采用C3算法,只是在某些情况下,C3算法的结果恰巧符合广度优先算法的结果. 可以通过代码来验证下: class NewStyleClassA(object): var = 'New Style Class A' class NewStyleClassB(NewStyleClassA): pass class NewStyleClassC(NewStyleClassA): var = 'New Style Class C' class

python D20 多继承、C3算法、super()

# 今日大纲# 1.多继承# 继承:x是一种y的时候,可以使用继承关系."is a"# 一个类同时继承多个类(python, c++)# eg:孙悟空是猴子,还是神仙,还是妖怪 # 2.经典类的MRO# 通过树形结构的深度优先遍历# 一条道走到黑(从左往右) # 3.新式类的MRO(重点.面试题)c3算法# 先拆分# 在合并,第一项的头和后面所有项的身子(除了头以外的部分)进行比较,如果都没有就拿出来,如果出现了,就跳过到后一项,后一项查一个完在跳会原来的位置继续上述动作 # 4.su

面向对象多继承 异常处理

总结 1 多继承 2封装,多态 :比如定义一个变量 a= 这里a可以赋值多种类型比如字典列表,字符串等 Python 本身就是默认多态的 3 super()方法 4 类的约束 5 异常处理 多继承的顺序 和 super()方法 ''' class A: def func1(self): # super().func() print(self,'A') class B(): def func(self): super().func() print(self,'这是B') class C(): de

python小兵 面向对象继承super和c3算法

python多继承 在前面的学习过程中. 我们已经知道了Python中类与类之间可以有继承关系. 当出现了x是一种y的的时候. 就可以使?继承关系. 即"is-a" 关系. 在继承关系中. 子类?自动拥有?类中除了私有属性外的其他所有内容. python支持多继承. 一个类可以拥有多个父类. 此时, 孙悟空是一只猴子, 同时也是一个神仙. 那孙悟空继承了这两个类. 孙悟空自然就可以执行这两个类中的方法. 多继承用起来简单. 也很好理解. 但是多继承中, 存在着这样一个问题. 当两个父类

多继承c3算法与网路编程

一.多继承c3算法 1.经典类与新式类 在python2之中,可以编写经典类和新式类,但是在python3之中编写的都是新式类 新式类,若自己和自己的前辈但凡有一个继承object,那么此类则为新式类 2.经典类和新式类的查找方法 经典类,深度优先的查找方式,即一条路走到黑,在先左后右的大方针之下,每一条查找到底在切换另一条线路 新式类,c3算法,使用Foo.__mro__可以查看Foo类的继承顺序,和__super__类似 3.c3算法 首先我们需要将每一条线路都写出来,大方针还是由左至右,r

python的继承,多继承,经典类的MRO,新式类的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): pri

16 继承 MRO和C3算法

一 多继承 Python中类与类之间可以有继承关系. 当出现了了x是一种y的的时候. 就可以使用继承关系. 即"is-a" 关系.  在继承关系中. 子类自动拥有父类中除了了私有属性外的其他所有内容.  python支持多继承. 一个类可以拥有多个父类. class ShenXian: # 神仙 def fei(self): print("神仙都会飞") class Monkey: # 猴 def chitao(self): print("猴?喜欢吃桃子&

python的垃圾回收机制 继承的顺序C3算法

Python垃圾回收    -- 引用计数        -- Python为每个对象维护一个引用计数        -- 当引用计数为0的 代表这个对象为垃圾    -- 标记清除        -- 解决孤立的循环引用        -- 标记根节点和可达对象        -- 不可达视为垃圾    -- 分代回收        -- 解决标记清除的效率问题        -- 0代 1代 2代        -- 阈值 (700,10,10)        -- 当调用c的接口开辟内存和

面向对象之继承、封装与多态

继承 继承是面向对象中的一个重要概念,通过如果要创建的类与以有的类大部分属性.方法类似,那么可以通过继承的方式创建.一个类可以继承一个或多个类,继承一个类称为单继承,继承多个类称为多继承.被继承的类称为父类,也称为超类或基类,继承的类称为子类或派生类. 继承的实现 class Animal: def __init__(self, name, age, color): self.name = name self.age = age self.color = color def eat(self):