继承情形一:
测试代码如下:
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):passclass D(B): def __init__(self):print('D')class E(C, D):pass
再次执行当前代码 x=E(),输出结果为A,然后删除掉A中的init方法,修改后的代码如下:
class A(object):passclass B(object):def __init__(self):print('B')class C(A):passclass D(B): def __init__(self):print('D')class E(C, D):pass
执行x=E();输出结果为D,然后删除D类中的init方法后,代码如下:
class A(object):passclass B(object):def __init__(self):print('B')class C(A):passclass D(B): passclass 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):passclass 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):passclass D(A): passclass E(C, D):pass
输出结果为A,可见在这种情况下python3搜索__init__方法的顺序是 E->C->D->A
总结:在两种不同的继承结构下,python3使用了不同的init方法的搜索策略。需要注意起来!