python - 多重继承和调用 super()

标签 python python-2.7 inheritance multiple-inheritance multiple-arguments

我收到错误: 类型错误:__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) 的调用引用了 Middle1 的(唯一)基类 Base。事实并非如此:它指的是self.__class__ 的MRO 中Middle1 之后的类。由于 self.__class__Top,因此下一个类是 Middle2,其 __init__ 仅采用一个参数。

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

我建议阅读两篇文章:

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

(坦白说,我最近没有读过这两篇文章,所以我不会尝试总结每篇文章中提出的建议。)

关于python - 多重继承和调用 super(),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42701702/

相关文章:

python - 使用自定义方法保存/加载 Keras 模型

模型父类字段上的 Django unique_together

c++ - 在模板函数中获取类型 T 的父级

python - 得到结果后编辑输出

python 2.7 异步函数与 tkinter

python - 如何在Python中准确解释大 float

java - 当使用组合而不是继承时,Comparator<T> 的替代方案是什么?

python - Scikit-learn 中的特征选择算法

python - 如何修复 PySide2 QPixmapCache.find() DeprecationWarning?

python - TF 数据集迭代器只前进一次而不是两次