一. python的继承. 多继承
子类继承父类.
为什么要继承???? 为了节省开发时间. 调高开发效率. 代码得到了重用
在python中存在多继承 MRO(method resolution Order) 方法路径顺序.
python2
1. 使用经典类(写继承关系的时候. 基类不继承object)
2. 新式类(继承关系的根. 是object)
python3
只有新式类 二. 经典类的MRO
经典类的MRO使用的是深度优先遍历 三. 新式类的MRO, C3(重点, 难点)
新式类中摒弃了(部分)旧的深度优先算法. 使用C3算法
如果你的继承关系中没有菱形继承( 深度优先就够了)
如果有菱形: 使用C3算法来计算MRO
假设C3算法. L(x) 表示 x的继承关系
先拆分。 拆到你能看出结果为止. 反着进行merge()运算
合并 - 归并
merge(元组, 元组, 元组,。。。。。。。) 摘头。
第一个元组的头(即第一个)和第后面的元组的尾(除了第一个)在比对,如果下一个尾没有这个头, 头摘出来,然后把所有元
组中和这个一样的类剔除如果头在后面的尾出现. 跳过该元组. 继续下一个元组的头和尾比对,直到比对完最后一个元组的
尾, 然后返回第一个元组继续比对头,循环直到最后一个元组. 根自己匹配
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 # 合
# + merge((B,), (A, ), 元组......)

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 N:
pass
class O:
pass
class M(N, O):
pass
class G(E, M):
pass
class H(G, F):
pass class K(H, G, F):
pass print(K.__mro__)

C3算法练习

L(K) = K + L(H) + L(G) + L(F) => K + (HGFDBMNOECA) + (GECAMNO) + (FDBECA) => KHGFDBECAMNO
L(H) = H + L(G) + L(F) => H + (GECAMNO) + (FDBECA) => HGFDBMNOECA
L(G) = G + L(E) + L(M) => G + (ECA) + (MNO) => GECAMNO
L(M) = M + L(N) + L(O) => M + N + O => MNO
L(O) = O
L(N) = N
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 + L(A) => CA
L(B) = B + L(A) => BA
L(A) = A (HGFDBMNOECA), (GECAMNO), (FDBECA) => 边摘出来边删除元组内容

计算MRO

四. super是神马玩意
super可以访问MRO列表中的下一个类中的内容. (找父类)
class Animal():
def chi(self):
print("吃。。。。。。。") class Cat(Animal): # Cat Animal Base
def chi(self): # 覆盖, 重写
super().chi() # 可以把父类中被重写了的内容 引入进来.
super(Cat, self).chi() # py2的
print("吃鱼") c = Cat()
c.chi()
用super(),将父类中的实例变量增加到子类中
class Foo:
def __init__(self, a, b, c):
self.a = a
self.b = b
self.c = c class Bar(Foo):
def __init__(self, a, b, c, d):
super(Bar, self).__init__(a, b, c)
self.d = d b = Bar(1,2,3,4)
print(b.__dict__)

五. 一道面试题
# 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) #
self.val += 2 #
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__) # 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)

Day21--Python--C3算法和super()的更多相关文章

  1. 最小生成树---Prim算法和Kruskal算法

    Prim算法 1.概览 普里姆算法(Prim算法),图论中的一种算法,可在加权连通图里搜索最小生成树.意即由此算法搜索到的边子集所构成的树中,不但包括了连通图里的所有顶点(英语:Vertex (gra ...

  2. 使用Apriori算法和FP-growth算法进行关联分析

    系列文章:<机器学习实战>学习笔记 最近看了<机器学习实战>中的第11章(使用Apriori算法进行关联分析)和第12章(使用FP-growth算法来高效发现频繁项集).正如章 ...

  3. 用Spark学习FP Tree算法和PrefixSpan算法

    在FP Tree算法原理总结和PrefixSpan算法原理总结中,我们对FP Tree和PrefixSpan这两种关联算法的原理做了总结,这里就从实践的角度介绍如何使用这两个算法.由于scikit-l ...

  4. 一些Python的惯用法和小技巧:Pythonic

    Pythonic其实是个模糊的含义,没有确定的解释.网上也没有过多关于Pythonic的说明,我个人的理解是更加Python,更符合Python的行为习惯.本文主要是说明一些Python的惯用法和小技 ...

  5. 经典算法和OJ网站(开发者必备-转)

    一. Online Judge简介: Online Judge系统(简称OJ)是一个在线的判题系统.用户可以在线提交程序多种程序(如C.C++.Pascal)源代码,系统对源代码进行编译和执行,并通过 ...

  6. BM算法和Sunday快速字符串匹配算法

    BM算法研究了很久了,说实话BM算法的资料还是比较少的,之前找了个资料看了,还是觉得有点生涩难懂,找了篇更好的和算法更好的,总算是把BM算法搞懂了. 1977年,Robert S.Boyer和J St ...

  7. 台球游戏的核心算法和AI(2)

    前言: 最近研究了box2dweb, 觉得自己编写Html5版台球游戏的时机已然成熟. 这也算是圆自己的一个愿望, 一个梦想. 承接该序列的相关博文: • 台球游戏核心算法和AI(1) 同时结合htm ...

  8. mahout中kmeans算法和Canopy算法实现原理

    本文讲一下mahout中kmeans算法和Canopy算法实现原理. 一. Kmeans是一个很经典的聚类算法,我想大家都非常熟悉.虽然算法较为简单,在实际应用中却可以有不错的效果:其算法原理也决定了 ...

  9. 转载:最小生成树-Prim算法和Kruskal算法

    本文摘自:http://www.cnblogs.com/biyeymyhjob/archive/2012/07/30/2615542.html 最小生成树-Prim算法和Kruskal算法 Prim算 ...

随机推荐

  1. 织梦后台如何生成站点地图sitemap.xml

    第一步在网站根目录建立sitemap.php文件 内容如下: 写一个计划任务文件命名为generate_sitemap.php,放在/plus/task目录里,文件内容如下: <?php//定时 ...

  2. Vue之computed计算属性

    demo.html <!DOCTYPE html> <html lang="en" xmlns:v-bind="http://www.w3.org/19 ...

  3. solrcloud编辑zookeeper上的配置文件的方法

    solrcloud的配置文件是上传在zookeeper文件系统上的.这样就面临一个问题,每次需要修改配置文件,就没有只有之前本地单机solr那么简单,需要上传. 搭建solrcloud时候提交配置文件 ...

  4. darknet源码解析

    https://blog.csdn.net/u014540717/article/category/6513159

  5. 自定义django-admin命令

    我们可以通过manage.py编写和注册自定义的命令. 自定义的管理命令对于独立脚本非常有用,特别是那些使用Linux的crontab服务,或者Windows的调度任务执行的脚本.比如,你有个需求,需 ...

  6. [代码]--给任意网站添加聊天功能,随时聊(fa)天(che)

    感谢“topurl.cn”制作此功能并分享. 这是一段代码,在打开的网页中使用,可以加载一个外挂形式的聊天室功能, 就可以和同样访问此网站进行相同操作的网友进行聊(fa)天(che)了. 使用方法: ...

  7. POJ 2112-Optimal Milking-二分答案+二分图匹配

    此题有多种做法. 使用floyd算法预处理最短路,二分答案,对于每一个mid,如果距离比mid小就连边, 注意把每个机器分成m个点.这样跑一个最大匹配,如果都匹配上就可以减小mid值. 用的算法比较多 ...

  8. python成长之路一

    1,计算机基础 CPU:中央处理器,相当于人类的大脑,运算中心,控制中心. 内存:暂时储存数据,与CPU交互,8G,16G,32G,64G § 优点:读取速度快. § 缺点:容量小,造价高,断电即消失 ...

  9. HDU4651 Partition 【多项式求逆】

    题目分析: 这题的做法是一个叫做五边形数定理的东西,我不会. 我们不难发现第$n$项的答案其实是: $$\prod_{i=1}^{\infty}\frac{1}{1-x^i}$$ 我们要对底下的东西求 ...

  10. Android stadio 生成项目 Plugin with id 'com.android.application' not found

    buildscript { repositories { jcenter() } dependencies { classpath 'com.android.tools.build:gradle:2. ...