1. 程式人生 > >python3 多繼承搜尋__init__方法的兩種策略

python3 多繼承搜尋__init__方法的兩種策略

繼承情形一:


測試程式碼如下:

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方法的搜尋策略。需要注意起來!