Python多重继承之带参数的钻石继承

作者: paranoid 分类: Python 发布时间: 2021-01-29 16:07

【填坑】带参数的钻石继承


日期: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初始化。从这里开始参数不对了。

问题解决

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被多次初始化

如果觉得我的文章对您有用,请随意赞赏。您的支持将鼓励我继续创作!

发表评论

邮箱地址不会被公开。