多重继承和调用super()

我得到的错误:TypeError:__init __()只需要2个参数(给出3)

当试图从类Top实例化一个对象时:

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

编辑

好的,我尝试了一些我认为适合我的案例。 这是等价的最终结果,我认为它基本上是先强制深度,而不是调用super并调用每个__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)指(只)基类BaseMiddle1 。 它没有:它指self.__class__的MRO中的Middle1之后的类。 因为self.__class__Top ,所以下一个类是Middle2 ,它的__init__只有一个参数。

要从方法中正确使用super ,需要确保该方法在每个类中都使用相同的参数,因为您无法通过查看代码本身来预测将调用哪个类的方法; 它完全取决于启动调用链的对象的类型,这可能是一个你还没有意识到的类。

我建议阅读两篇文章:

  • Python的超级()认为超级!
  • Python的Super很漂亮,但你不能非常小心地理解super的语义。
  • 他们一起给你一个很好的理解什么时候可以正确使用super ,以及如何避免你在这里看到的问题。

    (在充分披露的信息中,我最近没有阅读过这两篇文章,所以我不会总结每篇文章中提出的建议。)


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

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

       topObj = Top()
       middleObj = Middle("middle")
       baseObj = Base("base", "type")
    
    链接地址: http://www.djcxy.com/p/26787.html

    上一篇: Multiple Inheritance and calling super()

    下一篇: calling parent constructors in python