zoukankan      html  css  js  c++  java
  • python-day20(继承)

    一. 多继承

    class Shen:
    def fly(self):
    print("大神会飞")
    class Hou:
    def chi(self):
    print("猴子吃桃子")

    class SunWuKong(Shen, Hou): # 一个类可以继承多个无关的类. 一个类可以被多个无关的类继承
    pass

    class TaiShangLaoJun(Shen):
    pass
    #
    # swk = SunWuKong()
    # swk.fly()
    # swk.chi()


    # 经典类. 在python2.2之前. 已经是历史了. MRO 采用的是树形结构的深度递归遍历(一条道跑到黑)
    # 新式类 在2.2之后产生新式类. 目前我们使用的. 所有的类的根都是object C3算法(merge)
    二. 经典类的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

    三. C3算法

    pass
    class M(F, E):
    pass
    class N:
    pass
    class P(M,N):
    pass
    class G(P):
    pass
    class O:
    pass
    class X(O):
    pass
    class H(G, X, F):
    pass
    print(H.__mro__)
    '''
    L(H) = H + L(G) + L(X) + L(F) + GXF HGPMXFDBECANO

    L(G) = G + L(P) + P # GPMFDBECAN
    L(X) = X + L(O) + O # XO
    L(F) = F + L(D) + L(E) + DE # FDBECA


    L(P) = P + L(M) + L(N) + MN # PMFDBECAN
    L(D) = D + L(B) + L(C) + BC # DBCA
    L(E) = E + L(C) + L(A) + CA # ECA

    L(M) = M + L(F) + L(E) + FE # ECA ECA E MFDBECA

    '''


    '''
    L(H) = H + L(G) + X+ L(F) HGPMFDBECAN FDBECA

    L(G) = G + L(P) GPMFDBECAN
    L(F) = F + L(D) + L(E) FDBECA

    L(P) = P + L(M) + L(N) PMFDBECAN
    L(D) = D + L(B) + L(C) DBCA
    L(E) = E + L(C) + L(A) ECA

    L(M) = M + L(F) + L(E) MFDBECA
    L(N) = N
    L(B) = B + L(A) BA
    L(C) = C + L(A) CA

    L(A) = A
    '''


    '''
    设L为查找方法的MRO顺序
    L(H) = H + L(G) + L(F)
    L(G) = G + L(E)
    L(F) = F + L(D) + L(E)
    L(D) = D + L(B) + L(C)
    L(B) = B + L(A)
    L(E) = E + L(C) + L(A)
    L(C) = C + L(A)
    L(A) = A


    合并. 从下向上合并. 拿出每一项的头和后一项的身体进行比较. 如果出现了. 就过, 从后一项的头继续去比较. 如果不出现就出来

    HGFDBECA

    L(H) = H + L(G) + L(F) ECA + FDBECA
    L(G) = G + L(E) GECA
    L(F) = F + L(D) + L(E) FDBECA
    L(D) = D + L(B) + L(C) DBCA
    L(B) = B + L(A) BA
    L(E) = E + L(C) + L(A) ECA
    L(C) = C + A CA
    L(A) = A

    新式类通过__mro__可以直接看到MRO的结果
    '''
    # HGF DBE CA object
    # print(H.__mro__)

    四. super

    super是查找mro顺序中的下一个

    单继承中我们可以认为super是对父类中的属性或方法的引入
     1 # super是查找mro顺序中的下一个
     2 # 单继承中我们可以认为super是对父类中的属性或方法的引入
     3 
     4 class ShengWu:
     5     def dong(self): # 实例方法
     6         print(self)
     7         print("我是生物")
     8 
     9 class Animal(ShengWu):
    10    pass
    11 
    12 class Cat(Animal):
    13     def dong(self): # 子类中出现了和父类重名的内容. 表示对父类的方法的覆盖(重写). 半盖(java)
    14         super(Animal, self).dong() # 定位到Animal. 找Animal的下一个
    15         # super(类, 对象).方法()  找到MRO中的类. 找这个类的下一个. 去执行方法
    16         print("我的猫也会动")
    17 
    18 # 找MRO中的下一个
    19 # Cat -> Animal -> ShengWu
    20 
    21 c = Cat()
    22 print(c)
    23 c.dong()
    24 
    25 
    26 
    27 
    28 # MRO + super ⾯试题
    29 class Init(object):
    30     def __init__(self, v):
    31         print("init")
    32         self.val = v # 2
    33 class Add2(Init):
    34     def __init__(self, val): # 2
    35         print("Add2")
    36         super(Add2, self).__init__(val)
    37         print(self.val) # 5.0
    38         self.val += 2 # 7.0
    39 class Mult(Init):
    40     def __init__(self, val):
    41         print("Mult")
    42         super(Mult, self).__init__(val)
    43         self.val *= 5 # 5.0
    44 class HaHa(Init):
    45     def __init__(self, val):
    46         print("哈哈")
    47         super(HaHa, self).__init__(val)
    48         self.val /= 5   # 1.0
    49 class Pro(Add2,Mult,HaHa): #
    50     pass
    51 class Incr(Pro):
    52     def __init__(self, val): # 5
    53         super(Incr, self).__init__(val)
    54         self.val += 1 # 8.0
    55 
    56         '''
    57         add2
    58         Mult
    59         哈哈
    60         init
    61         5.0
    62         8.0
    63         Add2
    64         init
    65         2
    66         4
    67         
    68         '''
    69 
    70 # Incr, pro, add2, mult, haha, Init
    71 p = Incr(5)
    72 print(p.val) # ?
    73 # Add2 init
    74 c = Add2(2)
    75 print(c.val) # ?
    View Code
      
  • 相关阅读:
    C#等同于正则表达式的写法
    操作XML
    对比工具集合
    IIS 部署的网站无法启动
    jdk_1.8 下载之后的配置
    sql server 2008认识 DENSE_RANK
    c# 二分查找算法
    c# 使用栈实现有效的括号
    sql server 自定义标量函数
    虚拟机cenos 重置密码
  • 原文地址:https://www.cnblogs.com/Thui/p/9955077.html
Copyright © 2011-2022 走看看