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算法的更多相关文章

  1. python的垃圾回收机制 继承的顺序C3算法

    Python垃圾回收    -- 引用计数        -- Python为每个对象维护一个引用计数        -- 当引用计数为0的 代表这个对象为垃圾    -- 标记清除        - ...

  2. Python的多继承问题-MRO和C3算法

    大部分内容转载自C3 线性化算法与 MRO 理解Python中的多继承 Python 中的方法解析顺序(Method Resolution Order, MRO)定义了多继承存在时 Python 解释 ...

  3. day21 MRO和C3算法

    核能来袭 --MRO和C3算法 1. python的多继承 2.python经典类的MRO 3.python新式类的MRO, C3算法 4.super 是什么鬼? 一.python的多继承 在前面的学 ...

  4. Python之MRO及其C3算法

    [<class '__main__.B'>, <class '__main__.A'>, <class 'object'>] (<class '__main_ ...

  5. python之路--MRO和C3算法

    一 . MRO(method resolution order) 多继承的一种方法,一种查找的顺序 在python3 里面是一种新类式MRO 需要用都的是C3算法 class A: pass clas ...

  6. python之MRO和C3算法

    python2类和python3类的区别pyhon2中才分新式类与经典类,python3中统一都是新式类Python 2.x中默认都是经典类,只有显式继承了object才是新式类python 3.x中 ...

  7. python中的MRO和C3算法

    一. 经典类和新式类 1.python多继承 在继承关系中,python子类自动用友父类中除了私有属性外的其他所有内容.python支持多继承.一个类可以拥有多个父类 2.python2和python ...

  8. python小兵 面向对象继承super和c3算法

    python多继承 在前面的学习过程中. 我们已经知道了Python中类与类之间可以有继承关系. 当出现了x是一种y的的时候. 就可以使⽤继承关系. 即"is-a" 关系. 在继承 ...

  9. python全栈开发day103-python垃圾回收机制、mro和c3算法解析、跨域jsonp\CORS、Content-Type组件

    Python垃圾回收 -- 引用计数 -- Python为每个对象维护一个引用计数 -- 当引用计数为0的 代表这个对象为垃圾 -- 标记清除 -- 解决孤立的循环引用 -- 标记根节点和可达对象 - ...

随机推荐

  1. VC 预定义宏

    列出预定义的 ANSI C和C++ Microsoft实现宏. 编译器识别预定义的ANSI C宏,并且Microsoft C++实现提供几个更多.这些宏不带参数,并且不能重定义.下面列出的某些预定义的 ...

  2. linux驱动工程面试必问知识点

    linux内核原理面试必问(由易到难) 简单型 1:linux中内核空间及用户空间的区别?用户空间与内核通信方式有哪些? 2:linux中内存划分及如何使用?虚拟地址及物理地址的概念及彼此之间的转化, ...

  3. Unity应用架构设计(1)—— MVVM 模式的设计和实施(Part 1)

    初识 MVVM 谈起 MVVM 设计模式,可能第一映像你会想到 WPF/Sliverlight,他们提供了的数据绑定(Data Binding),命令(Command)等功能,这让 MVVM 模式得到 ...

  4. Effective Java 第三版—— 87. 考虑使用自定义序列化形式

    Tips 书中的源代码地址:https://github.com/jbloch/effective-java-3e-source-code 注意,书中的有些代码里方法是基于Java 9 API中的,所 ...

  5. 在 java 开发接口中需要注意的问题

    1 在开发过程中免不了对接上游或下游,有合作就要保证入参.出参的准确性.一个接口一般只能处理有限情况下的情况,因此在逻辑处理前要对入参进行校验. 2 在自己的逻辑处理过程中,要时刻持有怀疑的态度.假设 ...

  6. 【原创 Hadoop&Spark 动手实践 3】Hadoop2.7.3 MapReduce理论与动手实践

    开始聊MapReduce,MapReduce是Hadoop的计算框架,我学Hadoop是从Hive开始入手,再到hdfs,当我学习hdfs时候,就感觉到hdfs和mapreduce关系的紧密.这个可能 ...

  7. [转]application.properties详解 --springBoot配置文件

    本文转载:http://blog.csdn.net/lpfsuperman/article/details/78287265###; # spring boot application.propert ...

  8. 前后端分离springmvc和RESTful理解

    1. 理解MVC MVC是一种经典的设计模式,全名为Model-View-Controller,即模型-视图-控制器. 其中,模型是用于封装数据的载体,例如,在Java中一般通过一个简单的POJO(P ...

  9. ImportError: No module named 'requests.packages.urllib3'

    场景:CentOS 7 运行微信告警脚本报错 原因:requests库版本问题 解决方法: sudo pip install requests urllib3 pyOpenSSL --force -- ...

  10. Houdini技术体系 基础管线(三) :UE4以选择区域的方式对地形做生成和更新 上篇

    背景     前一节里,解决了Houdini地形无缝导入到UE4的流程问题.但这种方法也有它的局限性,在实际游戏项目里,LA和LD还是偏向在游戏引擎编辑器里工作,他们的一些设计也会影响到地形的信息,那 ...