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


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章