继承情形一:
测试代码如下:
class A(object):
def __init__(self):
print('A')
class B(object):
def __init__(self):
print('B')
class C(A):
def __init__(self):
print('C')
class D(B):
def __init__(self):
print('D')
class E(C, D):
pass
执行当前代码 x=E(),打印输出为:C;说明在E类中不存在init方法的时候,先找C中的init方法;
修改代码,去掉C类中的init方法,修改后,的代码如下
class A(object):
def __init__(self):
print('A')
class B(object):
def __init__(self):
print('B')
class C(A):
pass
class D(B):
def __init__(self):
print('D')
class E(C, D):
pass
再次执行当前代码 x=E(),输出结果为A,然后删除掉A中的init方法,修改后的代码如下:
class A(object):
pass
class B(object):
def __init__(self):
print('B')
class C(A):
pass
class D(B):
def __init__(self):
print('D')
class E(C, D):
pass
执行x=E();输出结果为D,然后删除D类中的init方法后,代码如下:
class A(object):
pass
class B(object):
def __init__(self):
print('B')
class C(A):
pass
class D(B):
pass
class E(C, D):
pass
运行 x =E();输出结果为B。
可见在这种情形下,python3搜索__init__方法的顺序是 E->C->A->D->B
继承情形二:
在这种集成情况下,类的初始化情况如下:
class A(object):
def __init__(self):
print('A')
class C(A):
def __init__(self):
print('C')
class D(A):
def __init__(self):
print('D')
class E(C, D):
pass
运行 x = E();输出结果为C,去掉类C中的init方法,代码结构如下:
class A(object):
def __init__(self):
print('A')
class C(A):
pass
class D(A):
def __init__(self):
print('D')
class E(C, D):
pass
运行 x=E();输出结果为D,去掉类D中的init方法,代码结构如下:
class A(object):
def __init__(self):
print('A')
class C(A):
pass
class D(A):
pass
class E(C, D):
pass
输出结果为A,可见在这种情况下python3搜索__init__方法的顺序是 E->C->D->A
总结:在两种不同的继承结构下,python3使用了不同的init方法的搜索策略。需要注意起来!