日期:2021年1月29日
前两天,在学习骆昊写的《Python - 100天从新手到大师》中的笔记:Day09 - 面向对象编程进阶中留下了一个带参数的钻石继承的坑,今天把它填上。
运行以下代码后,程序报错:TypeError: __init__() takes 3 positional arguments but 4 were given
class A:
def __init__(self,a):
self.a=a
print(self.a)
class B(A):
def __init__(self,a,b):
super().__init__(a)
self.b=b
print(self.b)
class C(A):
def __init__(self,a,c):
super().__init__(a)
self.c=c
print(self.c)
class D(B,C):
def __init__(self,a,b,c,d):
super().__init__(a,b,c)
self.d=d
print(self.d)
def main():
A(1)
B(2,3)
C(4,5)
D(6,7,8,9)
if __name__=='__main__':
main()
python的钻石继承 实际上是被拉成了线性。从d来看,分别继承b和c。那么b的 super().init(a)实际上是在给c初始化。从这里开始参数不对了。
感谢ufo0033的解答
class A:
def __init__(self, a, *args, **kwargs):
print('进入A')
self.a = a
print("A message:", self.a)
print('离开A')
class B(A):
def __init__(self, b, *args, **kwargs):
print('进入B')
super(B, self).__init__(*args, **kwargs)
self.b = b
print("B message:", self.b)
print('离开B')
class C(A):
def __init__(self, c, *args, **kwargs):
print('进入C')
super(C, self).__init__(*args, **kwargs)
self.c = c
print("C message:",self.c)
print('离开C')
class D(B, C):
def __init__(self, d, *args, **kwargs):
print('进入D')
super(D, self).__init__(*args, **kwargs)
self.d = d
print("D message:",self.d)
print('离开D')
def main():
# A(1)
# B(2, 3)
# C(4, 5)
D(6, 7, 8, 9)
if __name__ == '__main__':
main()
这样的设计可以防止A被多次初始化