python3 多繼承搜尋__init__方法的兩種策略
阿新 • • 發佈:2019-01-02
繼承情形一:
測試程式碼如下:
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方法的搜尋策略。需要注意起來!