python中的继承

Posted 雾霾1024

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了python中的继承相关的知识,希望对你有一定的参考价值。

一.继承,多继承

  子类继承父类:为父类进行扩展

  MRO(method resolution order) 方法解析顺序

  python 2

    1.使用经典类(写继承关系的时候,基类不继承object)

    2.新式类(继承关系的根,是object)

  python 3

    只有新式类

二.经典类的MRO

  经典类的MRO使用的是深度优先遍历

    从左到右,一直走到头,每个走一次

三.新式类的MRO C3

  1.新式类中摒弃了(部分)的深度优先算法,使用C3算法

  2.如果你的继承关系中没有菱形继承,深度优先来计算MRO

            有菱形继承,使用C3算法来计算MRO

  3.C3算法

    先拆分再合并

    拆分 : 例如拆分H :  L(H) = H + L(G) + L(F) + GF

    合并 : 例如合并C:   L(C) = C + L(A) + A     = CA

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 M: pass class N(M): pass class P(E, A): pass class X: pass class Q(P, N, X): pass class G(Q, F): pass class H(G, F): pass ‘‘‘ 求H的MRO 设求MRO的算法是L L(H) = H + L(G) + L(F) + GF L(G) = G + L(E) + E L(E) = E + L(C) + L(A) + CA L(C) = C + L(A) + A L(A) = A L(F) = F + L(D) + L(E) + DE L(D) = D + L(B) + L(C) + BC L(B) = B + L(A) + A # 加法:merge(), 拿第一项的第一位和 后面每项的除了第一位比较. 如果没有出现, 则该位元素算出 如果出现了. 此时开始下一项的第一位继续和后面每一项的除了第一位比较: 用头和后面身体比较 L(H) = H + L(G) + L(F) + GF # ECA + DBECA = HGFDBECAO L(G) = G + L(E) + E # GECA L(E) = E + L(C) + L(A) + CA # ECA L(C) = C + L(A) + A # CA L(A) = A L(F) = F + L(D) + L(E) + DE # FDBECA L(D) = D + L(B) + L(C) + BC # DBCA L(B) = B + A + A # BA ‘‘‘ print(H.__mro__)

四.super()

  super()可以访问MRO中的下一个类中的内容.找父类

  super(类名,self) 从某个类开始找下一个MRO

  先算MRO顺序,再看清楚self是谁,在什么是进行计算

class Init(object):
    def __init__(self, v): # 2
        print("init")
        self.val = v

class Add2(Init):
    def __init__(self, val): # 2
        print("Add2")
        super(Add2, self).__init__(val) # Mult
        print(self.val)
        self.val += 2

class Mult(Init):
    def __init__(self, val):
        print("Mult")
        super(Mult, self).__init__(val) # Haha
        self.val *= 5

class HaHa(Init):
   def __init__(self, val):
        print("哈哈")
        super(HaHa, self).__init__(val) # Init
        self.val /= 5

class Pro(Add2,Mult,HaHa): #
    pass

class Incr(Pro): # incr->pro->add2->Mult->HaHa->init
    def __init__(self, val): # 5
        super(Incr, self).__init__(val) # Add2
        self.val += 1
p = Incr(5)
print(p.val)
c = Add2(2)
print(c.val)








以上是关于python中的继承的主要内容,如果未能解决你的问题,请参考以下文章

请解释python面向对象中的继承

Python代码阅读(第13篇):检测列表中的元素是否都一样

在PaddlePaddle中的Notebook代码片段

python中的继承

Android 逆向使用 Python 解析 ELF 文件 ( Capstone 反汇编 ELF 文件中的机器码数据 | 创建反汇编解析器实例对象 | 设置汇编解析器显示细节 )(代码片段

片段中的 MapView(蜂窝)