16 继承 MRO和C3算法

一 多继承

  • Python中类与类之间可以有继承关系. 当出现了了x是一种y的的时候. 就可以使用继承关系. 即"is-a" 关系.  在继承关系中. 子类自动拥有父类中除了了私有属性外的其他所有内容.  python支持多继承. 一个类可以拥有多个父类.

class ShenXian: # 神仙
    def fei(self):
        print("神仙都会飞")
class Monkey:   # 猴
    def chitao(self):
        print("猴?喜欢吃桃子")
class SunWukong(ShenXian, Monkey): # 孙悟空是神仙, 同时也是一只猴
    pass
sxz = SunWukong()   # 孙悟空
sxz.chitao()    # 会吃桃?子
sxz.fei()       # 会?
#悟空既是猴子也是神仙所以可以多继承,也就可以执行两个类中的方法

  但是如果父类有重名的方法,又该先访问谁馁?这时就涉及到如何查找父类方法的这么一个问题。即MRO(method resolution order) 问题。在python中这是一个很复杂的问题。因为在不同的 python版本中使用的是不同的算法来完成MRO的。

  python2.3以前的解决方法:是深度优先遍历方案,什么是深度优先,就是一条路走到头,然后再回来,继续找下一个。

二、 目前python采用的是新式的MRoOo的算法,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

                                 步骤                    结果
L(H) = H + L(G) + L(F) + GF      H GECA  FDBECA GF       HGFDBECA
L(G) = G + L(E) + E              G ECA E                 GECA
L(F) = F + L(D) + L(E) + DE      F DBCA ECA DE           FDBECA
L(E) = E + L(C) + L(A) + CA      E CA A CA               ECA
L(D) = D + L(B) + L(C) + BC      D BA CA BC              DBCA
L(B) = B + L(A) + A              B A A                   BA
L(C) = C + L(A) + A              C A A                   CA
L(A) = A                         A                       A

print(H.mro())
# [<class ‘__main__.H‘>, <class ‘__main__.G‘>, <class ‘__main__.F‘>, <class ‘__main__.D‘>, <class ‘__main__.B‘>,
# <class ‘__main__.E‘>, <class ‘__main__.C‘>, <class ‘__main__.A‘>, <class ‘object‘>]

具体算法使用最后一步说明  L(H) = H  GECA  FDBECA  GF 一共四项对于每一项后面都要加上继承的组合 GF,E,DE,CA等 ,从第一项  H 开始,和后面每一项除了他们的第一个字母比较如果后面项的‘身体’没有出现H  则拿出来,  如果出现相同的 H 就先跳过第一项,拿出第二项第一个继续和后面项的身体比较以此类推。根据这个例子:

1 首先 H 后面项身体没出现所以提取H.

2.G和后面项比较后面项身体也没有出现提取G(此刻删除所有以G开头项的G).

3.剩下 ECA  FDBECA  F  继续比较E发现第二项身体有跳过第一项,使用第二项开头的 F 和后面比较后面也没有 提取 F(记得删除 剩下的项 ECA DBECA) 此时提取出的有(HGF).

4.回到第一项使用E比较 发现还是有 继续跳过 使用第二项 D比较后面 提取D.

5 返回第一项继续拿到E 第二项依然有 依然拿到 B.

6.返回到第一项E比较此时第二项身体没有E了 提取第一项E并删除E 此刻剩下 CA  CA 提取了 HGFDBE  所以后面两项为CA.

三  supper()

class ShengWu:
    def dong(self): # 实例方法
        print(self)
        print("我是生物")

class Animal(ShengWu):
   def dong(self):
       print(‘我是动物‘)

class Cat(Animal):
    def dong(self): # 子类中出现了和父类重名的内容. 表示对父类的方法的覆盖(重写). 半盖(java)
        super().dong()  #找到Animal
        super(Animal, self).dong() # 可以定位到Animal. 找Animal的下一个即生物
        # super(类, 对象).方法()  找到MRO中的类. 找这个类的下一个. 去执行方法
        print("我的猫也会动")

原文地址:https://www.cnblogs.com/-0121/p/9955066.html

时间: 2024-11-08 06:35:57

16 继承 MRO和C3算法的相关文章

mro之C3算法

mro之C3算法 # C3算法 归并算法 class A(object): pass class B(A): pass class C(A): pass class D(B): pass class E(C): pass class F(D, E): pass print(F.__mro__) ######################### # 第一步先找到继承的父类的MRO # D = [D, B, A, O] # E = [E, C, A, O] # 第二步 把父类这两个MRO 和 DE

python中的MRO和C3算法

一. 经典类和新式类 1.python多继承 在继承关系中,python子类自动用友父类中除了私有属性外的其他所有内容.python支持多继承.一个类可以拥有多个父类 2.python2和python3的区别 python2中存在两种类,一个叫经典类,在python2.2之前,一直使用的经典类.经典类是在基类的根如果什么都不写.表示继承xxx 另一个叫做心事类,在python2.2之后出现了心事类.新式类的特点是基类的根是object python3中使用的都是新式类.如果基类谁都不继承,那这个

python的MRO和C3算法

python2类和python3类的区别pyhon2中才分新式类与经典类,python3中统一都是新式类Python 2.x中默认都是经典类,只有显式继承了object才是新式类python 3.x中默认都是新式类,经典类被移除,不必显式的继承object改变了经典类中一个多继承的bug,因为其采用了广度优先的算法 class A(object): def test(self): print('from A') class B(A): def test(self): print('from B'

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

python多继承 在前面的学习过程中. 我们已经知道了Python中类与类之间可以有继承关系. 当出现了x是一种y的的时候. 就可以使?继承关系. 即"is-a" 关系. 在继承关系中. 子类?自动拥有?类中除了私有属性外的其他所有内容. python支持多继承. 一个类可以拥有多个父类. 此时, 孙悟空是一只猴子, 同时也是一个神仙. 那孙悟空继承了这两个类. 孙悟空自然就可以执行这两个类中的方法. 多继承用起来简单. 也很好理解. 但是多继承中, 存在着这样一个问题. 当两个父类

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

Python垃圾回收    -- 引用计数        -- Python为每个对象维护一个引用计数        -- 当引用计数为0的 代表这个对象为垃圾    -- 标记清除        -- 解决孤立的循环引用        -- 标记根节点和可达对象        -- 不可达视为垃圾    -- 分代回收        -- 解决标记清除的效率问题        -- 0代 1代 2代        -- 阈值 (700,10,10)        -- 当调用c的接口开辟内存和

6.MRO和C3算法

经典类的MRO python3以不存在经典类 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,从左往右的顺序 新式

python的继承,多继承,经典类的MRO,新式类的MRO,C3算法,super

#继承 class JiaoFu: def qd(self): print("教父带你祈祷") class Fu: def msj(self): print("alex喜欢msj") class Zi(Fu, JiaoFu): def dbj(self): print("刘伟喜欢大宝剑") z = Zi() z.msj() z.dbj() z.qd() class Base1: # Base1 object def func(self): pri

Python新式类继承的C3算法

在Python的新式类中,方法解析顺序并非是广度优先的算法,而是采用C3算法,只是在某些情况下,C3算法的结果恰巧符合广度优先算法的结果. 可以通过代码来验证下: class NewStyleClassA(object): var = 'New Style Class A' class NewStyleClassB(NewStyleClassA): pass class NewStyleClassC(NewStyleClassA): var = 'New Style Class C' class

python D20 多继承、C3算法、super()

# 今日大纲# 1.多继承# 继承:x是一种y的时候,可以使用继承关系."is a"# 一个类同时继承多个类(python, c++)# eg:孙悟空是猴子,还是神仙,还是妖怪 # 2.经典类的MRO# 通过树形结构的深度优先遍历# 一条道走到黑(从左往右) # 3.新式类的MRO(重点.面试题)c3算法# 先拆分# 在合并,第一项的头和后面所有项的身子(除了头以外的部分)进行比较,如果都没有就拿出来,如果出现了,就跳过到后一项,后一项查一个完在跳会原来的位置继续上述动作 # 4.su