day21 MRO和C3算法
核能来袭 --MRO和C3算法
1. python的多继承
2.python经典类的MRO
3.python新式类的MRO, C3算法
4.super 是什么鬼?
一.python的多继承
在前面的学习过程中,我们已经知道了python中类与类之间可以有继承关系,当出现了x是一种y的时候,局可以使用继承关系.在继承关系中,子类自动拥有父类除了私有属性外的其他所有的内容,python支持多继承.一个类可以拥有多个父类.
class ShenXian: #神仙
def fei(self):
print('神仙都会飞') class Monkey: #猴
def chitao(self):
print('猴子喜欢吃桃子') class WuKong(shenxian,Monkey): # 孙悟空
pass qtds=WuKong() #齐天大圣
qtds.chitao() # 吃桃
qtds.fei() # 飞
多继承用起来很简单,也很好理解,但是如果2个父类中出现重名方法时,这时就出现了查找顺序的问题,即MRO问题:
在python2中存在2 类,经典类,新式类(注意:树形结构图和C3算法算出来的结果不一定是相同的)
经典类:在python2.2之前,一直使用的是经典类,经典类在基类的根如果什么都不写,表示继承xxx
新式类:在python2.2之后出现了新式类,特点是基类的根是object
在python3中,
都是新式类,如果基类谁都不继承,那么这个类默认继承object
二 . python经典类的MRO
虽然python3中不存在经典类了,但还是要学一学,经典类是一种树形结构遍历的一个最直接的案例,在python继承体系中,我们可以把类与类继承关系化成一个树形结构图,
class A:
pass
class B(A):
pass
class C(A):
pass
class D(B, C):
pass
class E:
pass
class F(D, E):
pass
class G(F, D):
pass
class H:
pass
class Foo(H, G):
pass
碰到这样的代码的时候,不要急,画树形结构图(从下往上画)这里就不列举了
结果,类的MRO: Foo-> H -> G -> F -> D -> B -> A -> C -> E.
三.新式类的MRO
Python个中的新式类的MRO是采用C3算法来完成的
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 G(E):
pass
class H(G, F):
pass
首先我们要确定从H开始找:(从下往上找),也就是说,创建的是H的对象.
设C3算法是L(x),找到x对的MRO,即:
L(H)=H+L(G)+L(F)+GF
继续从父类中往上找
L(G) = G + L(E) + E
L(F) = F + L(D)+ L(E) + DE
继续找E 和 D
L(E) = E + L(C) + L(A) + CA
L(D) = D + L(B) + L(C) + BC
继续找B和C
L(B) = B + L(A) + A
L(C) = C + L(A) + A
(注:加法,merge(),拿第一项的第一位与后面每项中除了第一位比较,如果没出现,算出这一位(算出后所有的这一个字母全部删除),继续拿这一位的下一位重复上面的操作;如果出现了,此时开始下一项的第一位继续跟后面每一项的出了第一位比较)
这个说完了,C3到底怎么看更容易呢,其实很简单,C3是把我们多个类产生的共同继承留到最后去找,所以,我们也可以从图上来看到相关的规律,这个要大家自己多写多画就能感觉到了,但是如果没有所谓的共同继承关系,那几乎就当成是深度遍历就可以了.
四.super是什么鬼?
super()可以帮我们执行MRO中下一个父类的方法,通常super()有两个使用的地方
1)可以访问父类的构造方法
2) 当子类方法想调用父类(MRO)中的方法
# 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
# Incr Pro Add2 Mult HaHa Init
p = Incr(5)
print(p.val)
c = Add2(2)
print(c.val)
结论: 不管super()写在哪里,在哪执行.一定先找到MRO列表,根据MRO列表的顺序往下找,否则一切都是错的
day21 MRO和C3算法的更多相关文章
- Python的多继承问题-MRO和C3算法
大部分内容转载自C3 线性化算法与 MRO 理解Python中的多继承 Python 中的方法解析顺序(Method Resolution Order, MRO)定义了多继承存在时 Python 解释 ...
- Python之MRO及其C3算法
[<class '__main__.B'>, <class '__main__.A'>, <class 'object'>] (<class '__main_ ...
- python全栈开发day103-python垃圾回收机制、mro和c3算法解析、跨域jsonp\CORS、Content-Type组件
Python垃圾回收 -- 引用计数 -- Python为每个对象维护一个引用计数 -- 当引用计数为0的 代表这个对象为垃圾 -- 标记清除 -- 解决孤立的循环引用 -- 标记根节点和可达对象 - ...
- python之路--MRO和C3算法
一 . MRO(method resolution order) 多继承的一种方法,一种查找的顺序 在python3 里面是一种新类式MRO 需要用都的是C3算法 class A: pass clas ...
- python摸爬滚打之day20--多继承,MRO和C3算法
1.新式类和经典类 在python2.2之前, 基类如果不写(), 则表示为经典类; 在python2.2之后, 经典类不复存在, 只存在新式类. 如果基类谁都不继承的话, 则默认继承object. ...
- python之MRO和C3算法
python2类和python3类的区别pyhon2中才分新式类与经典类,python3中统一都是新式类Python 2.x中默认都是经典类,只有显式继承了object才是新式类python 3.x中 ...
- MRO和C3算法
本节主要内容: 1.python多继承 2.python经典类的MRO 3.python新式类的MRO,C3算法 4.super() 一.python多继承 在python中类与类之间可以有继承关系, ...
- python MRO及c3算法
1. 了解python2和python3类的区别 python2在2.3之前使用的是经典类, 2.3之后, 使用的是新式类 2. 经典类的MRO 树形结构的深度优先遍历 -> 树形结构遍历 cl ...
- python中的MRO和C3算法
一. 经典类和新式类 1.python多继承 在继承关系中,python子类自动用友父类中除了私有属性外的其他所有内容.python支持多继承.一个类可以拥有多个父类 2.python2和python ...
随机推荐
- 牛客网NOIP赛前集训营-提高组(第七场)C 洞穴
洞穴 思路: 矩阵乘法 由于只需要知道 A ^ l 的 第a行第b个元素 所以我们每次在做矩阵乘法时只需要算第a行就可以了 还要像矩阵快速幂一样预处理A ^ (1<<d) 代码: #pra ...
- Java访问ActiveMQ
1.下载安装ActiveMQ 下载可以去官网下载:http://activemq.apache.org/download.html.我们这里使用windows测试,所以下载windows版本即可. 2 ...
- 关于 Oracle DB CONSTRAINT约束的一些SQL ORA-02292: integrity constraint violated
ALTER TABLE table_name DISABLE CONSTRAINT constraint_name; select * from all_constraints where owner ...
- mysqlsh : mysql shell tutorial
MySQL Shell 是一个高级的命令行客户端以及代码编辑器for Mysql. 除了SQL,MySQL Shell也提供脚本能力 for JS and Python. When MySQL she ...
- pythoncook 文件和io
1.文件不存在,则写入:文件存在则,报错 try: with open('file','x') as f: f.write() except FileExistsError: print('file ...
- English trip V1 - B 14. There Are Flowers in My Office 我办公室里有花 Teacher:Lamb Key: There be(is/are)
In this lesson you will learn to describe a room or place. 这节课讲学习描述一个房间或地方 课上内容(Lesson) 1. Where do ...
- 利用Xml架构生成实体访问类
由xml生成xsd及实体类 xmldataset工具 使用VS2005工具XSD.exe(SDK/v2.0/Bin/xsd.exe)自动生成实体类: xsd /c /namespace:myCom ...
- 【洛谷p1319】压缩技术
(许久不见,甚是想念) 压缩技术[传送门] 洛谷上滴算法标签: 然而这是一道入门难度的题.(不管不管,就写它了) 好的先说一下思路吧wait!我忘记了咋做的当时. 首先做题第一道坎儿,如何输入若干个( ...
- ERROR: java.lang.NullPointerException的一种情况
java.lang.NullPointerException错误,错误原因就是以下六条没配置完: 1.JAVA环境配置正确.2.源码里面的包没有与tomcat的包冲突.3.把数据库文件给导入到了SQL ...
- IDEA中部署tomcat,运行JSP文件,编译后的JSP文件存放地点总结
首先保证你正常部署了Tomcat,并且正常在浏览器中运行了JSP文件. 那么Tomcat编译后的JSP文件(_jsp.class 和 _jsp.java)的存放地点: (一)一般存放在你安装的Tomc ...