zoukankan      html  css  js  c++  java
  • python3.6入门到高阶(全栈) day020 多继承,MRO和C3算法

    今日主要内容
    1. 多继承
    继承: x是一种y的时候.可以使用继承关系. "is a"
    一个类同时继承多个类(python, c++)
    孙悟空是一种猴子, 还是一种神仙

    例 class ShenXian: # 神仙
    def fei(self):
    print("神仙都会⻜")
    class Monkey: # 猴
    def chitao(self):
    print("猴⼦喜欢吃桃⼦")
    class SunWukong(ShenXian, Monkey): # 孙悟空是神仙, 同时也是⼀只猴
    pass
    sxz = SunWukong() # 孙悟空
    sxz.chitao() # 会吃桃⼦
    sxz.fei()

    2. 经典类的MRO
    通过数型结构的深度优先遍历
    一条道走到黑(从左往右)

    3. 新式类的MRO(重点, 难点) C3算法
    先拆分
    再合并 第一项的头和后面所有项的尾进行比较如果出现了. 就拿出来 如果没出现. 下一项....
    例 1 class A: pass
    2 class B(A): pass
    3 class C(A): pass
    4 class D(B, C): pass
    5 class E(C, A): pass
    6 class Y: pass
    7 class F(D,Y, E): pass
    8 class G(E): pass
    9 class H(G, F): pass
    10
    11 # 先拆分 再从下往上合并, 把前一项的头和后面所有项的身体进行比较, 如果后面出现了则直接跳过, 没有的话前一项接着往后走
    12 # S(H) = H + S(G) + S(F) + GF HGFD BYEC A
    13 # S(G) = G + S(E) GECA
    14 # S(F) = F + S(D) + S(Y) + S(E) + DYE FDBYECA
    15 # S(E) = E + S(C) + S(A) + CA ECA
    16 # S(D) = D + S(B) + S(C) + BC DBCA
    17 # S(B) = B + S(A) BA
    18 # S(C) = C + S(A) CA
    19 print(H.mro()) # HGFD BYEC A
    引用 https://www.cnblogs.com/bk9527/p/9954366.html

    4. super() (重点)
    找MRO顺序的下一个

    例 class Foo:
    def func1(self):
    super().func1() # 此时找的是MRO顺序中下⼀个类的func1()⽅法
    print("我的⽼家. 就住在这个屯")
    class Bar:
    def func1(self):
    print("你的⽼家. 不在这个屯")

    class Ku(Foo, Bar):
    def func1(self):
    super().func1() # 此时super找的是Foo
    print("他的⽼家. 不知道在哪个屯")
    k = Ku() # 先看MRO . KU, FOO, BAR object
    k.func1()
    k2 = Foo() # 此时的MRO. Foo object
    k2.func1() # 报错
  • 相关阅读:
    QSetting
    类中函数前、后、参数加const
    delete指针
    自定义数组类
    手动调用构造函数
    windows和linux平台下的通用时间测试函数
    多线程编程学习
    Android 利用ImageView显示图片
    特征描述算子-sift
    opencv边界扩展
  • 原文地址:https://www.cnblogs.com/wanxiangai/p/9954850.html
Copyright © 2011-2022 走看看