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


猜你喜欢

转载自blog.csdn.net/u012613903/article/details/80496924
今日推荐