这种多重继承有什么问题?
What is the problem in this multiple inheritance?
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
错误是在classB
中调用super().__init__(name)
引起的。与 Java 等单继承语言不同,Python 中的 super()
不一定会给你超级class;它会为您提供 method resolution order 中的下一个 class。 class D
的 MRO 是这样的:
>>> D.__mro__
(<class '__main__.D'>,
<class '__main__.B'>,
<class '__main__.C'>,
<class '__main__.A'>,
<class 'object'>)
如您所见,MRO 中 B
之后的下一个 class 是 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
.
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
错误是在classB
中调用super().__init__(name)
引起的。与 Java 等单继承语言不同,Python 中的 super()
不一定会给你超级class;它会为您提供 method resolution order 中的下一个 class。 class D
的 MRO 是这样的:
>>> D.__mro__
(<class '__main__.D'>,
<class '__main__.B'>,
<class '__main__.C'>,
<class '__main__.A'>,
<class 'object'>)
如您所见,MRO 中 B
之后的下一个 class 是 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
.