首页 文章

多重继承并调用super()

提问于
浏览
2

我收到错误: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 回答

  • 3

    首先,您必须查看 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 ,您需要确保该方法在每个类中使用相同的参数,因为您无法预测哪个类甚至还没有知道 .

    我建议阅读两篇帖子:

    它们一起使您很好地理解 super 何时可以正确使用以及如何避免您在此处看到的问题 .

    (在完整的披露中,我最近没有阅读过任何一篇文章,所以我将不会试图总结每篇文章中提出的建议 . )

  • 0

    你究竟是如何实例化Top对象的?

    鉴于上面的代码,以下工作正常:

    topObj = Top()
       middleObj = Middle("middle")
       baseObj = Base("base", "type")
    

相关问题