手推C3算法
C3算法规则
-- 每一个类的继承顺序都是从基类向子类看
-- 形成一个指向关系的顺序[当前类] + [父类的继承顺序]
-- 进行一个提取
-- 如果一个类出现从左到右的第一个顺序上,并且没有出现在后面的顺序中,或者出现在后面顺序了,但是仍然是第一个,那么就把这个类提取出来
示例1

# class A(object): ...
# class B(A): ...
# class C(A): ...
# class D(B, C): ...
# print(D.__mro__) # (<class '__main__.D'>, <class '__main__.B'>, <class '__main__.C'>, <class '__main__.A'>, <class 'object'>)
'''手推mro,从上至下的顺序
L(A) = [A] + [O]
A = [0]
A0 = []
L(A) = AO L(B) = [B] + [A0]
B = [AO]
BA = [O]
BAO = []
L(B) = BAO L(C) = [C] + [AO]
C = [AO]
CA = [0]
CAO = []
L(C) = CAO L(D) = [D] + [BAO] + [CAO]
D = [BAO] + [CAO]
DB = [AO] + [CAO]
DBC = [AO] + [AO]
DBCA = [O] + [O]
DBCAO = []
L(D) = DBCA0
'''
示例2

# class G(object): ...
# class E(G): ...
# class D(object): ...
# class F(object): ...
# class B(D, E): ...
# class C(D, F): ...
# class A(B, C): ...
# print(A.__mro__) # ABCDEGFO (<class '__main__.A'>, <class '__main__.B'>, <class '__main__.C'>, <class '__main__.D'>, <class '__main__.E'>, <class '__main__.G'>, <class '__main__.F'>, <class 'object'>)
'''手推C3算法
L(G) = [G] + [O]
G = [O]
GO = []
L(G) = GO L(E) = [E] + [G0]
E = [GO]
EG = [O]
EGO = []
L(E) = EGO L(D) = [D] + [DO]
D = [O]
DO = []
L(D) = DO L(F) = [F] + [FO]
F = [O]
FO = []
L(F) = FO L(B) = [B] + [DO] + [EGO]
B = [DO] + [EGO]
BD = [O] + [EGO]
BDE = [O] + [GO]
BDEG = [O] + [O]
BDEGO = []
L(B) = BDEGO L(C) = [C] + [DO] + [FO]
C = [DO] + [FO]
CD = [O] + [FO]
CDF = [O] + [O]
CDFO = []
L(C) = CDFO L(A) = [A] + [BDEGO] + [CDFO]
A = [BDEGO] + [CDFO]
AB = [DEGO] + [CDFO]
ABC = [DEGO] + [DFO]
ABCD = [EGO] + [FO]
ABCDE = [GO] + [FO]
ABCDEG = [O] + [FO]
ABCDEGF = [O] + [O]
ABCDEGFO = []
L(A) = ABCDEGFO
'''
应用
看代码,请说出执行流程
class A(object):
def __init__(self):
print("enter A")
print("leave A")
class B(object):
def __init__(self):
print("enter B")
print("leave B")
class C(A):
def __init__(self):
print("enter C")
super().__init__()
print("leave C")
class D(A):
def __init__(self):
print("enter D")
super().__init__()
print("leave D")
class E(B, C):
def __init__(self):
print("enter E")
B.__init__(self)
C.__init__(self)
print("leave E")
class F(E, D):
def __init__(self):
print("enter F")
E.__init__(self)
D.__init__(self)
print("leave F")
F()
# print(F.__mro__) # FEBCDA0 (<class '__main__.F'>, <class '__main__.E'>, <class '__main__.B'>, <class '__main__.C'>, <class '__main__.D'>, <class '__main__.A'>, <class 'object'>)
# 打印结果如下示例
'''
enter F
enter E
enter B
leave B
enter C
enter D
enter A
leave A
leave D
leave C
leave E
enter D
enter A
leave A
leave D
leave F
'''
demo
解:
首先观察代码,画出继承顺序图

那么这里为什么要用到c3算法,就是为了算出mro顺序(这里只能手推,不能打印)。当算出来mro顺序之后,我们就可以在后面用到了。
''' L(A) = [A] + [O]
A = [0]
AO = []
L(A) = AO L(B) = [B] + [O]
B = [O]
BO = []
L(B) = BO L(C) = [C] + [AO]
C = [AO]
CA = [O]
CAO = []
L(C) = CAO L(D) = [D] + [AO]
D = [AO]
DA = [O]
DAO = []
L(D) = DAO L(E) = [E] + [BO] + [CAO]
E = [BO] + [CAO]
EB = [O] + [CAO]
EBC = [O] + [AO]
EBCA = [O] + [O]
EBCAO = []
L(E) = EBCAO L(F) = [F] + [EBCAO] + [DAO]
F = [EBCAO] + [DAO]
FE = [BCAO] + [DAO]
FEB = [CAO] + [DAO]
FEBC = [AO] + [DAO]
FEBCD = [AO] + [AO]
FEBCDA = [O] + [O]
FEBCDAO = []
L(F) = FEBCDAO
'''
手推C3算法,求出mro顺序
一番推算,mro的顺序为FEBCDAO。
接下来,我们开始解释代码的执行流程。
'''
先把mro的继承顺序,放这里:FEBCDAO
1. 代码从第F()开始执行,执行其内部的init方法首先打印enter F
2. 执行E中的init方法,打印一行enter E
3. 执行B中的init方法,打印enter B,紧接着打印leave B,执行完毕,代码回到E中
4. 执行C中的init方法,打印enter C, 然后调用父类的super方法,
那该执行父类的init方法,这里要知道C的父类是谁?是A吗?(注意,关键点来了)
不是!而是顺着mro的顺序查找,C后面是D,所以,执行D的init方法
首先打印enter D, 接着D又执行super方法,找父类的super方法,mro中是A
所以执行A中的init方法,打印enter A,在打印leave A,然后,回到D中
又打印leave D,执行完毕,回到C中
打印leave C,执行完毕,回到E中
打印leave E,E此时也执行完毕,回到最开始的F中
5. 执行D中init方法
首先打印enter D
调用父类的super方法,从mro找父类
打印enter A
打印leave A
A执行完毕,回到D中
打印leave D
执行完毕,回到最初F中
6. 打印leave F,程序结束 enter F
enter E
enter B
leave B
enter C
enter D
enter A
leave A
leave D
leave C
leave E
enter D
enter A
leave A
leave D
leave F
'''
that's all
手推C3算法的更多相关文章
- 手推Apriori算法------挖掘频繁项集
版权声明:本文为博主原创文章,未经博主允许不得转载. Apriori算法: 使用一种称为逐层搜索的迭代方法,其中K项集用于搜索(K+1)项集. 首先,通过扫描数据库,统计每个项的计数,并收集满足最小支 ...
- python之路--MRO和C3算法
一 . MRO(method resolution order) 多继承的一种方法,一种查找的顺序 在python3 里面是一种新类式MRO 需要用都的是C3算法 class A: pass clas ...
- python 之C3算法
C3算法只要针对的Python2.3版本之后出现的新式类MRO(method resolution order) -------继承方法查询顺序;而经典类MRO则遵循的是深度优先遍历(树形结构) (1 ...
- MRO和C3算法
本节主要内容: 1.python多继承 2.python经典类的MRO 3.python新式类的MRO,C3算法 4.super() 一.python多继承 在python中类与类之间可以有继承关系, ...
- Python-MRO和C3算法
一. python多继承 在前面的学习过程中,我们已经知道了python中类与类之间可以有继承关系,当出现x是一种y的时候就可以使用继承关系.即'is-a'关系,在继承关系中子类自动拥有父类中除了私有 ...
- C3算法之我见
C3算法说到底就是merge算法,看了一些帖子,总结说得莫名其妙,大家也是抄来抄去,我试着用自己的话来把这个东西怎么操作的说清楚.当然了我也要抄一些别人的,但是我会 尽量把我认为别人没有讲清楚的那一部 ...
- day28 Pyhton MRO和C3算法
1.python多继承.一个类可以拥有多个父类 class ShenXian: # 神仙 def fei(self): print("神仙都会飞") class Monkey: # ...
- python小兵 面向对象继承super和c3算法
python多继承 在前面的学习过程中. 我们已经知道了Python中类与类之间可以有继承关系. 当出现了x是一种y的的时候. 就可以使⽤继承关系. 即"is-a" 关系. 在继承 ...
- Python之MRO及其C3算法
[<class '__main__.B'>, <class '__main__.A'>, <class 'object'>] (<class '__main_ ...
随机推荐
- CSS3中的3D动画实现(钟摆、魔方)--实现代码
CSS3中的3D动画实现(钟摆.魔方) transition-property 过渡动画属性 all|[attr] transition-duration 过渡时间 transition-delay ...
- nodejs----安装配置
Node.js 安装配置 Node.js 安装包及源码下载地址为:https://nodejs.org/en/download/. 你可以根据不同平台系统选择你需要的 Node.js 安装包. Nod ...
- python opencv 读取USB摄像头的像素问题
问题描述 每次调用capture读取video的时候,还回的像素都是640x480,不管是笔记本的摄像头还是USB摄像头,明明我的摄像头是支持130万读取的功能的呀. 问题分析 一番查找,关于用ope ...
- 2019OO第二单元总结
(1)设计策略 电梯第1次作业是一个傻瓜调度电梯,使用先来先服务原则,不用考虑捎带(可以认为电梯的载客量为1),因此比较简单,调度器用一个队列就可以. 使用生产者-消费者模型,输入线程是生产者,电梯是 ...
- 描述逻辑(DL)基础知识
Logic逻辑理论实际上是一个规范性(normative)的理论,而不是一个描述性的(descriptive)理论.即,它并不是用来描述人类究竟是采用何种的形式来推理的,而是来研究人类应该如何有效的进 ...
- sqlmap常用渗透方法
0X001 适用场景 1.获取了Mysql数据库root账号以及密码. 2.可以访问3306端口以及数据库. 0X002 扫描获取root账号的密码 通常有下面一些方法来获取root账号的密码 (1) ...
- fiddler4微信抓包教程
使用fiddler来抓包: 需要先做一些简单的准备工作: 一台带有无线网卡的PC或者笔记本电脑,然后将电脑和手机连接到同一个Wi-Fi网络中,并且保证二者是在同一个ip网段内的: 在电脑上安装 Fid ...
- 深度学习基础(四) Dropout_Improving neural networks by preventing co-adaptation of feature detectors
该笔记是我快速浏览论文后的记录,部分章节并没有仔细看,所以比较粗糙. 从摘要中可以得知,论文提出在每次训练时通过随机忽略一半的feature detectors(units)可以极大地降低过拟合.该方 ...
- JDBC 查询
//查询""SMITH"的empno import java.sql.Connection; import java.sql.DriverManager; import ...
- Java学习-051-Detected both log4j-over-slf4j.jar AND bound slf4j-log4j12.jar on the class path, preempting StackOverflowError
错误信息:Detected both log4j-over-slf4j.jar AND bound slf4j-log4j12.jar on the class path, preempting St ...