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')
解决方案
该错误是由对super().__init__(name)
类中的调用引起的B
。与 Java 等单继承语言不同,super()
Python 并不一定会给你超类。它为您提供方法解析顺序中的下一个类。班级的 MROD
是这样的:
>>> 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__
方法需要两个参数,因此仅使用一个参数调用它会导致您看到的错误。
推荐阅读
- javascript - 使用 Javascript 或 jQuery 防止在文本字段中输入数字
- c - 如何在没有“/”操作的情况下除以 13
- c# - Back propogation on multi layered neural networks
- c# - 无法在 Visual Studio 2017 Professional 中运行单元测试
- javascript - 配额“AnalyticsDefaultGroup”的令牌不足,并为消费者限制服务“analyticsreporting.googleapis.com”的“USER-100s”
- json - 如何快速从本地 JSON 文件中获取数据?
- safari - Safari 推送通知 authenticationToken
- python - python 2.7 - argparse:可选参数的参数
- angularjs - 如何在打开fancybox时更改URL并在使用angular cli关闭这个fancybox时恢复URL?
- c# - 在 c# 中获得类似于 js-sha1 库的双哈希结果