我得到错误:typeError:__init __()精确2个参数(3给定)
试图从类顶部实例化对象时:
super(中间1,self).__ INT __(名称,"中间")
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()
首先,您必须查看 Top
的方法分辨率顺序:
>>> for c in Top.__mro__: print c
...
<class '__main__.Top'>
<class '__main__.Middle1'>
<class '__main__.Middle2'>
<class '__main__.Middle3'>
<class '__main__.Base'>
<type 'object'>
这可以帮助您查看super
代表的每个呼叫的类别。
您的错误是认为对super(Middle1, self)
的调用是指Middle1
的(仅)基类Base
。它不是:它指的是self.__class__
MRO中的Middle1
的类。由于self.__class__
是Top
,因此下一类是Middle2
,其__init__
仅采用一个参数。
要从方法正确使用super
,您需要确保该方法在每个类中使用相同的参数,因为您无法通过查看代码本身来预测将调用哪个类的方法;这完全取决于启动呼叫链的对象的类型,这可能是您甚至还不知道的类。
我建议阅读两篇文章:
- Python的Super()被认为超级!
- Python的超级很漂亮,但是您不能非常仔细地使用它来了解
super
的语义。
一起,他们可以很好地了解何时可以正确使用super
以及如何避免您在此处看到的问题。
(在全面披露中,我最近都没有阅读任何一篇文章,所以我将避免试图总结每个帖子。)
您如何确切地实例化顶部对象?
给定上面的代码,以下作用正常:
topObj = Top()
middleObj = Middle("middle")
baseObj = Base("base", "type")