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算 ...
随机推荐
- falsk sqlalchemy 自关联创建评论回复数据库
本项目在于创建类似微信上的评论回复功能的数据库 基类: from app import db from datetime import datetime class Basemadel(object) ...
- react双向事件的绑定
双向绑定有三步,第一步,触发onChange事件,第二步,拿到input里的值,第三步,使用setState将拿到的值传回到state中. 如何拿到input里的值,可以有两种方法,第一种方法是参数e ...
- codeforces570C
Replacement CodeForces - 570C 话说很久很久以前,孙悟空被压在了山下,很无聊.于是他找了一个只包含小写字母和字符"." 的字符串. 由于他比较无聊,他就 ...
- CF821C Okabe and Boxes
题目链接 题目大意 模拟栈的操作,要求从1~n依次弹出,若不符合可以排序,且不会有不合法情况,求最少排序次数. 思路 由于一定没有不合法情况,所以每次不符合顺序时可以直接清空,遇到栈为空时仍然要求弹出 ...
- Python介绍及环境配置
Python 简介 Python 是一个高层次的结合了解释性.编译性.互动性和面向对象的脚本语言. Python 的设计具有很强的可读性,相比其他语言经常使用英文关键字,其他语言的一些标点符号,它具有 ...
- 获取SpringMVC所有的rest接口及其对应函数信息
package com.geostar.gfstack.operationcenter.core.cloud.action; import com.geostar.gfstack.operationc ...
- Pearls POJ - 1260 dp
题意:有n种不同的珍珠 每种珍珠的价格不同 现在给出一个采购单 标注了需要不同等级的珍珠和相对于的个数(输入按价格升序排列) 其中 价格为 (当前种类价格+10)*购买数量 这样就有一种诡异的 ...
- [SCOI2005] 互不侵犯
传送门:>Here< 解题思路 其实这道题一种很简单的解法是搜索+打表,但是这样很赖皮.这里给出一种状压DP的解法. 很显然利用普通的DP无法解决了,因为针对点来转移是很难的.但看到$N& ...
- Tmutarakan Exams URAL - 1091(莫比乌斯函数 || 容斥)
题意: 求1 - s 中 找出k个数 使它们的gcd > 1 求这样的k个数的对数 解析: 从每个素数的倍数中取k个数 求方案数 然后素数组合,容斥一下重的 奇加偶减 莫比乌斯函数的直接套模 ...
- 【AGC005F】Many Easy Problems FFT 容斥原理
题目大意 给你一棵树,有\(n\)个点.还给你了一个整数\(k\). 设\(S\)为树上某些点的集合,定义\(f(S)\)为最小的包含\(S\)的联通子图的大小. \(n\)个点选\(k\)个点一共有 ...