• python基础 day25 面向对象-继承2


    一、多继承顺序问题

    python2 中有新式类和经典类的区别,python3中全部都是新式类,区别在于python3的所有类默认继承object类

    在python3中 ----广度优先

    # python3
    class A:
        def func(self):
            print('A')
    class B(A):
        pass
    class C(A):
        def func(self):
            print('C')
    class D(B, C):
        pass
    
    s = D()
    s.func()  # C
    

    而在python2中 ---深度优先

    # python2
    class A:
        def func(self):
            print('A')
    class B(A):
        pass
    class C(A):
        def func(self):
            print('C')
    class D(B, C):
        pass
    
    s = D()
    s.func()  # A
    

    广度优先的继承顺序

    广度优先遵循C3算法:
    如果是单继承,那么总是按照从子类->父类的顺序来计算查找顺序。
    如果是多继承,需要按照自己本类,父类1的顺序继承,父类2的顺序继承
    merge规则:如果一个类出现在从左到右所有顺序的最左侧,并且没有在其他位置出现,那么先提出来作为继承顺序中的一个;
    或 如果一个类出现在从左到右所有顺序的最左侧,并且没有在其他顺序中出现,那么先提出来作为继承顺序中的一个;
    如果从左到右第一个顺序中的第一个类出现在后面且不是第一个,那么不能提取,顺序向后继续找其他顺序中符合上述条件的类。

    class A:
        pass
    class B(A):
        pass
    class C(A):
        pass
    class D(B):
        pass
    class E(C):
        pass
    class F(D,E):
        pass
    s = F()
    # 继承顺序F->D->B->E->C->A
    
    # 查看继承顺序(只适用新式类)
    print(F.mro())
    # [<class '__main__.F'>, <class '__main__.D'>, <class '__main__.B'>, <class '__main__.E'>, <class '__main__.C'>, <class '__main__.A'>, <class 'object'>]
    

    二、多态

    一个类型表现出来的多种形态

    java中一个参数必须制定类型,如果想让两个类型的对象都可以传,那么必须让这两个类继承自一个父类,在制定类型的时候使用父类来制定。

    python 中处处是多态

  • 相关阅读:
    leetcode[164] Maximum Gap
    leetcode[162] Find Peak Element
    leetcode[160] Intersection of Two Linked Lists
    leetcode[156] binary tree upside down
    leetcode[155] Min Stack
    leetcode Find Minimum in Rotated Sorted Array II
    leetcode Find Minimum in Rotated Sorted Array
    leetcode Maximum Product Subarray
    ROP
    windbg bp condition
  • 原文地址:https://www.cnblogs.com/west-yang/p/12931164.html
Copyright © 2020-2023  润新知