多个继承和调用super()



我得到错误: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")

相关内容

  • 没有找到相关文章

最新更新