继承情形一:
测试代码如下:
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方法的搜索策略。需要注意起来!