我收到错误:TypeError:__ init __()需要2个参数(给定3个)
尝试从类顶部实例化对象时:
super(Middle1,self).__ init __(name,“middle”)
class Base(object):
def __init__(self, name, type):
pass
class Middle1(Base):
def __init__(self, name):
super(Middle1, self).__init__(name, "middle1")
class Middle2(Base):
def __init__(self, name):
super(Middle2, self).__init__(name, "middle2")
class Middle3(Base):
def __init__(self, name):
super(Middle3, self).__init__(name, "middle3")
class Top(Middle1, Middle2, Middle3):
def __init__(self):
super(Top, self).__init__("top")
# Here is where it produces the error
if __name__ == '__main__':
Top()
我不理解这个多重继承问题是什么?
注意:这是python 2.7
编辑
好的,所以我尝试了一些我觉得适用于我的情况的东西 . 这是平等的最终结果,我认为它基本上是通过不调用超级并且调用每个__init__来强制深度 .
class Base(object):
def __init__(self, name, type):
pass
class Middle1(Base):
def __init__(self, name, type = "middle1"):
super(Middle1, self).__init__(name, type)
class Middle2(Base):
def __init__(self, name, type = "middle2"):
super(Middle2, self).__init__(name, type)
class Middle3(Base):
def __init__(self, name, type = "middle3"):
super(Middle3, self).__init__(name, type)
class Top(Middle1, Middle2, Middle3):
def __init__(self):
Middle1.__init__(self, "top")
Middle2.__init__(self, "top")
Middle3.__init__(self, "top")
# No errors anymore
if __name__ == '__main__':
Top()
2 回答
首先,您必须查看
Top
的方法解析顺序:这有助于您查看每次调用
super
所代表的类 .你的错误是认为对
super(Middle1, self)
的调用是指Middle1
的(仅)基类Base
. 它没有:它指的是self.__class__
的MRO中的Middle1
之后的类 . 由于self.__class__
是Top
,行中的下一个类是Middle2
,其__init__
只接受一个参数 .要从方法中正确使用
super
,您需要确保该方法在每个类中使用相同的参数,因为您无法预测哪个类甚至还没有知道 .我建议阅读两篇帖子:
Python's super() considered super!
Python's Super is nifty, but you can't use it非常仔细地理解
super
的语义 .它们一起使您很好地理解
super
何时可以正确使用以及如何避免您在此处看到的问题 .(在完整的披露中,我最近没有阅读过任何一篇文章,所以我将不会试图总结每篇文章中提出的建议 . )
你究竟是如何实例化Top对象的?
鉴于上面的代码,以下工作正常: