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


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值