python摸爬滚打之day20--多继承,MRO和C3算法
1、新式类和经典类
在python2.2之前, 基类如果不写(), 则表示为经典类;
在python2.2之后, 经典类不复存在, 只存在新式类. 如果基类谁都不继承的话, 则默认继承object.
2、MRO----()方法解释顺序
主要用于多继承时判断属性的路径(来自于哪个类).
经典类的MRO算法 ------树形结构的深度优先遍历
原则: 按继承顺序从左子树到右子树, 一条道走到黑.
- 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 顺序: H G F D B A C E
经典类MRO顺序
3、新式类的MRO顺序 ----> 遵循C3算法
先由MRO确定一个线性序列, 然后查找路径由线性序列中类的顺序决定, C3算法就是生成这样的一个线性序列.
c3算法的核心是merge算法.
merge原则: 拿前一项的头和后面所有项的身体进行比较, 如果在后面没有出现, 则拿出这个头并划掉出现的所有该元素,前一项继续往后走;
如果在后面项中出现, 则前一项(a)剩余全部跳过, 比较第二项(b)(用第二项(b)的头和后面所有项的身体比较, 有的话继续跳过去, 比较第三项(c)), 啥时候没有出现, 拿出并划掉后继续返回前一项(a)剩下的元素继续比较.
注意: 可以这样查找: C3算法就是把每个环节多个类产生的共同继承留到最后去找.
- class A: pass
- class B(A): pass
- class C(A): pass
- class D(B, C): pass
- class E(C, A): pass
- class Y: pass
- class F(D,Y, E): pass
- class G(E): pass
- class H(G, F): pass
- # 先拆分 再从下往上合并, 把前一项的头和后面所有项的身体进行比较, 如果后面出现了则直接跳过, 没有的话前一项接着往后走
- # S(H) = H + S(G) + S(F) + GF HGFD BYEC A
- # S(G) = G + S(E) GECA
- # S(F) = F + S(D) + S(Y) + S(E) + DYE FDBYECA
- # S(E) = E + S(C) + S(A) + CA ECA
- # S(D) = D + S(B) + S(C) + BC DBCA
- # S(B) = B + S(A) BA
- # S(C) = C + S(A) CA
- print(H.mro()) # HGFD BYEC A
新式类Mro顺序
4、super() ----> 执行MRO中的下一个父类方法.
- class Foo:
- def func1(self):
- super().func1() # 找下一个父类 Bar
- print("走你2")
- class Bar:
- def func1(self):
- print("走你1")
- class Ku(Foo,Bar):
- def func1(self):
- super().func1() # 找下一个父类 Foo
- print("走你3")
- k = Ku()
- k.func1()
- # MRO顺序: ku ----> Foo ----> Bar ----> object
super()
5、已经有继承关系了还要用super()继承呢?
因为有时候普通的继承关系是满足不了需求的.
比如: 用父类的方法来完成自己的一部分代码, 这个时候就能用得到super()了.
- class Base:
- def __init__(self,a,b,c):
- self.a = a
- self.b = b
- self.c = c
- class Foo(Base):
- def __init__(self,a,b,c,d):
- super(Foo, self).__init__(a,b,c) # 用父类方法来构造自己的a,b,c, 自己再添加self.d.
- self.d = d # 如果用单纯的非super继承很难实现.
- f = Foo(11,22,33,44)
- print(f.a)
- print(f.b)
- print(f.c)
- print(f.d)
super()继承
再比如: 如果继承的多个类中都存在相同的方法, 使用super能很精准地定位到要执行方法的类.
- class Animal:
- def act(self):
- print("动物会动")
- class Cat(Animal):
- def act(self):
- print("猫会动")
- class BosiCat(Cat):
- def act(self):
- super(Cat, self).act() # 可以很精准地定位到执行cat()类的下一个类的act()方法, 不用super()很难定位精确.
- print("波斯猫会动")
- b = BosiCat().act()
super()继承
python摸爬滚打之day20--多继承,MRO和C3算法的更多相关文章
- python的垃圾回收机制 继承的顺序C3算法
Python垃圾回收 -- 引用计数 -- Python为每个对象维护一个引用计数 -- 当引用计数为0的 代表这个对象为垃圾 -- 标记清除 - ...
- Python的多继承问题-MRO和C3算法
大部分内容转载自C3 线性化算法与 MRO 理解Python中的多继承 Python 中的方法解析顺序(Method Resolution Order, MRO)定义了多继承存在时 Python 解释 ...
- day21 MRO和C3算法
核能来袭 --MRO和C3算法 1. python的多继承 2.python经典类的MRO 3.python新式类的MRO, C3算法 4.super 是什么鬼? 一.python的多继承 在前面的学 ...
- Python之MRO及其C3算法
[<class '__main__.B'>, <class '__main__.A'>, <class 'object'>] (<class '__main_ ...
- python之路--MRO和C3算法
一 . MRO(method resolution order) 多继承的一种方法,一种查找的顺序 在python3 里面是一种新类式MRO 需要用都的是C3算法 class A: pass clas ...
- python之MRO和C3算法
python2类和python3类的区别pyhon2中才分新式类与经典类,python3中统一都是新式类Python 2.x中默认都是经典类,只有显式继承了object才是新式类python 3.x中 ...
- python中的MRO和C3算法
一. 经典类和新式类 1.python多继承 在继承关系中,python子类自动用友父类中除了私有属性外的其他所有内容.python支持多继承.一个类可以拥有多个父类 2.python2和python ...
- python小兵 面向对象继承super和c3算法
python多继承 在前面的学习过程中. 我们已经知道了Python中类与类之间可以有继承关系. 当出现了x是一种y的的时候. 就可以使⽤继承关系. 即"is-a" 关系. 在继承 ...
- python全栈开发day103-python垃圾回收机制、mro和c3算法解析、跨域jsonp\CORS、Content-Type组件
Python垃圾回收 -- 引用计数 -- Python为每个对象维护一个引用计数 -- 当引用计数为0的 代表这个对象为垃圾 -- 标记清除 -- 解决孤立的循环引用 -- 标记根节点和可达对象 - ...
随机推荐
- Effective Java 第三版—— 85. 其他替代方式优于Java本身序列化
Tips 书中的源代码地址:https://github.com/jbloch/effective-java-3e-source-code 注意,书中的有些代码里方法是基于Java 9 API中的,所 ...
- UltraVNC 简体中文版 1.2.2.1
1.专门针对WinXP进行编译,同时适用XP之后的Windows版本(XP/Vista/8.1/10/2003/2008/2012): 2.配置低的计算机,Win8.1之前的系统,需要安装Mirror ...
- 我的IntelliJ IDEA 设置
1.关闭代码折叠 2.设置代码格式 3.函数参数提醒
- 【原创 Hadoop&Spark 动手实践 3】Hadoop2.7.3 MapReduce理论与动手实践
开始聊MapReduce,MapReduce是Hadoop的计算框架,我学Hadoop是从Hive开始入手,再到hdfs,当我学习hdfs时候,就感觉到hdfs和mapreduce关系的紧密.这个可能 ...
- RDLC 根据条件改变背景颜色-多个IIF
=IIf(Fields!DATE_DIFF.Value < 5 ,"White",IIf(Fields!DATE_DIFF.Value >=5 AND Fields!D ...
- css世界的学习笔记
1.+选择器div+p:选择紧接在div后的所有p元素: 2.导航的样式:(注意:不给a设置width:100%;只是需要display:block;利用流布居:) <h4>无宽度,借助流 ...
- 每天学习一个命令:find 查找文件
查找的动作在平时使用的频率也还是很高的,所以知道并用好 find 这个命令也很重要.find 命令顾名思义,就是搜索特定文件夹内的文件. 基本使用 最基本的使用 find [path] [expres ...
- ios 适配iOS11&iPhoneX的一些坑
前阵子项目开发忙成狗,就一直没做iOS11的适配,直到XcodeGM版发布后,我胸有成竹的在iPhoneX上跑起项目,整个人都凉透了...下面总结一下我遇到的坑,不是很全面,日后补充. 导航栏 导航栏 ...
- Linux 环境变量_006
***Linux 环境变量指系统运行程序或命令的能快速找到其位置等其它功能,不用输入复杂命令.以$PATH环境变量为例子, $PATH决定了shell指定寻找命令或程序的路径,比较执行ls命令,如果没 ...
- 24小时学通Linux内核之向内核添加代码
睡了个好觉,很晚才起,好久没有这么舒服过了,今天的任务不重,所以压力不大,呵呵,现在的天气真的好冷,不过实验室有空调,我还是喜欢待在这里,有一种不一样的感觉,在写了这么多天之后,自己有些不懂的页渐渐的 ...