繼承情形一:
測試代碼如下:
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方法的搜索策略。需要注意起來!