Python学习笔记(一)——多级继承存在的问题

Python支持多继承,测试时发现子类使用super()一直报错,提示构造方法参数不匹配。后来跟踪了一下,发现问题症结,代码如下:

class A(object):
    def __init__(self, name, age, *args, **kwargs):
        print('A的init开始被调用,self为:', self)
        self.name = name
        self.age = age
        print('A的init结束被调用')


class B(A):
    def __init__(self, name, age, b_id, *args, **kwargs):
        print('B的init开始被调用,self为:', self)
        self.b_id = b_id
        super().__init__(name, age, b_id, *args, **kwargs)
        print('B的init结束被调用')


class C(A):
    def __init__(self, name, age, c_id, *args, **kwargs):
        print('C的init开始被调用,self为:', self)
        self.c_id = c_id
        super().__init__(name, age, c_id, *args, **kwargs)
        print('C的init结束被调用')


class D(B, C):
    def __init__(self, name, age, b_id, c_id, d_id):
        print('D的init开始被调用,self为:', self)
        super().__init__(name, age, b_id, c_id, d_id)
        self.d_id = d_id
        print('D的init结束被调用')


# print(D.__mro__)
gs = D('D', 10, 20, 30, 40)
print('姓名:', gs.name)
print('年龄:', gs.age)
print('ID:', gs.d_id)

# 运行结果如下:
D的init开始被调用,self为: <__main__.D object at 0x000002D8EE0FF2E0>
B的init开始被调用,self为: <__main__.D object at 0x000002D8EE0FF2E0>
C的init开始被调用,self为: <__main__.D object at 0x000002D8EE0FF2E0>
A的init开始被调用,self为: <__main__.D object at 0x000002D8EE0FF2E0>
A的init结束被调用
C的init结束被调用
B的init结束被调用
D的init结束被调用
姓名: D
年龄: 10
ID: 40

也就是说super().__init__()会把当前子类的实例返回到父类的__init__()中,多级使用super()便会逐级返回,如果想分别使用继承了祖先级的父级类中的属性,若不使用可变参数,则会提示参数报错。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值