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 中处处是多态

原文地址:https://www.cnblogs.com/west-yang/p/12931164.html