一、多继承顺序问题
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 中处处是多态