Day21--Python--C3算法和super()
一. 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()的更多相关文章
- 最小生成树---Prim算法和Kruskal算法
Prim算法 1.概览 普里姆算法(Prim算法),图论中的一种算法,可在加权连通图里搜索最小生成树.意即由此算法搜索到的边子集所构成的树中,不但包括了连通图里的所有顶点(英语:Vertex (gra ...
- 使用Apriori算法和FP-growth算法进行关联分析
系列文章:<机器学习实战>学习笔记 最近看了<机器学习实战>中的第11章(使用Apriori算法进行关联分析)和第12章(使用FP-growth算法来高效发现频繁项集).正如章 ...
- 用Spark学习FP Tree算法和PrefixSpan算法
在FP Tree算法原理总结和PrefixSpan算法原理总结中,我们对FP Tree和PrefixSpan这两种关联算法的原理做了总结,这里就从实践的角度介绍如何使用这两个算法.由于scikit-l ...
- 一些Python的惯用法和小技巧:Pythonic
Pythonic其实是个模糊的含义,没有确定的解释.网上也没有过多关于Pythonic的说明,我个人的理解是更加Python,更符合Python的行为习惯.本文主要是说明一些Python的惯用法和小技 ...
- 经典算法和OJ网站(开发者必备-转)
一. Online Judge简介: Online Judge系统(简称OJ)是一个在线的判题系统.用户可以在线提交程序多种程序(如C.C++.Pascal)源代码,系统对源代码进行编译和执行,并通过 ...
- BM算法和Sunday快速字符串匹配算法
BM算法研究了很久了,说实话BM算法的资料还是比较少的,之前找了个资料看了,还是觉得有点生涩难懂,找了篇更好的和算法更好的,总算是把BM算法搞懂了. 1977年,Robert S.Boyer和J St ...
- 台球游戏的核心算法和AI(2)
前言: 最近研究了box2dweb, 觉得自己编写Html5版台球游戏的时机已然成熟. 这也算是圆自己的一个愿望, 一个梦想. 承接该序列的相关博文: • 台球游戏核心算法和AI(1) 同时结合htm ...
- mahout中kmeans算法和Canopy算法实现原理
本文讲一下mahout中kmeans算法和Canopy算法实现原理. 一. Kmeans是一个很经典的聚类算法,我想大家都非常熟悉.虽然算法较为简单,在实际应用中却可以有不错的效果:其算法原理也决定了 ...
- 转载:最小生成树-Prim算法和Kruskal算法
本文摘自:http://www.cnblogs.com/biyeymyhjob/archive/2012/07/30/2615542.html 最小生成树-Prim算法和Kruskal算法 Prim算 ...
随机推荐
- InnoDB: Error: Table "mysql"."innodb_table_stats" not found.
问题:打开mysql错误日志时发现大量的如下错误 Error: Table "mysql"."innodb_table_stats" not found. In ...
- zabbix自定义监控项
原因:zabbix监控系统自带的监控规则有限,如果需要更加灵活的定义监控项,可以通过修改配置文件实现 vim xxx/zabbix_agentd.conf UnsafeUserParameters=1 ...
- QTP 自动货测试桌面程序-笔记-运行结果中添加截图
3种方法: 方法1:使用设置:SnapshotReportMode oldMode = Setting("SnapshotReportMode") Setting("Sn ...
- codeforces/gym/101291/B
题意:给你n个杠铃的杆子,在给你m个杠铃片,问你能组成多少个重量不同的完整杠铃(杠铃杆子也算一个完整的的杠铃) 解题思路:dfs直接搜,数据很小,每个杠铃片有三种状态(放杆子左边,放杆子右边,两边都不 ...
- 鼠标事件-MouseEvent
当鼠标进行某种操作时,就会生成一个event对象,该对象记录着鼠标触发事件时的所有属性. 可以通过如下方法在google控制台打印出 MouseEvent 对象. function mouseDown ...
- python 项目启动路径自动添加
import os import sys base_dir = os.path.dirname(os.path.dirname(os.path.abspath(__file__))) #找到当前项目 ...
- python 模块之-time
python 模块time import time # 1 time() :返回当前时间的时间戳 time.time() #1473525444.037215 #------------------- ...
- Luogu4726 【模板】多项式指数函数(NTT+多项式求逆)
https://www.cnblogs.com/HocRiser/p/8207295.html 安利! #include<iostream> #include<cstdio> ...
- #195 game(动态规划+二分)
考虑第一问的部分分.显然设f[i]为i子树从根开始扩展的所需步数,考虑根节点的扩展顺序,显然应该按儿子子树所需步数从大到小进行扩展,将其排序即可. 要做到n=3e5,考虑换根dp.计算某点答案时先将其 ...
- HDU 4344-Mark the Rope-大数素因子分解
注意只有一个素因子的情况. #include <cstdio> #include <algorithm> #include <cstring> using name ...