多重继承的问题是什么?

2024-04-25 21:17:44 发布

您现在位置:Python中文网/ 问答频道 /正文

class A:

    def __init__(self,name):
        self.name=name

class B(A):

    def __init__(self,name,add):
        super().__init__(name)
        self.add = add

class C(A):

    def __init__(self,name,tel):
        super().__init__(name)
        self.tel = tel

class D(B,C):

    def __init__(self,name,add,tel,company):
        super().__init__(name,add)
        super().__init__(name,tel)
        self.company = company

d = D('Hank','ctm',55514,'google')

enter image description here


Tags: nameimageselfaddinitdefgoogledescription
2条回答

该错误是由调用类B中的super().__init__(name)引起的。与Java等单一继承语言不同,Python中的super()不一定给出超类;它给出了method resolution order中的下一个类。类D的MRO如下:

>>> D.__mro__
(<class '__main__.D'>,
 <class '__main__.B'>,
 <class '__main__.C'>,
 <class '__main__.A'>,
 <class 'object'>)

如您所见,MRO中B之后的下一个类是C,因此对super().__init__(name)的调用使用单个参数调用C.__init__。但是,C.__init__方法需要两个参数,因此仅用一个参数调用它会导致您看到的错误。你知道吗

这种多重继承的解决方案是协同设计类,请参见Raymond的文章Python’s super() considered super!

class A:
    def __init__(self, name, **kwargs):
        self.name = name

class B(A):
    def __init__(self, add, **kwargs):
        super().__init__(**kwargs)
        self.add = add

class C(A):
    def __init__(self, tel, **kwargs):
        super().__init__(**kwargs)
        self.tel = tel

class D(B, C):
    def __init__(self, company, **kwargs):
        super().__init__(**kwargs)
        self.company = company

d = D(name='Hank', add='ctm', tel=55514, company='google')

正如其他人指出的,这将遵循MRO,例如D -> B -> C - A。你知道吗

相关问题 更多 >