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()便会逐级返回,如果想分别使用继承了祖先级的父级类中的属性,若不使用可变参数,则会提示参数报错。