乘法继承QWidget和另一个基class?

Multiply inherit from QWidget and another base class?

我正在尝试创建一个 PyQt5.QtWidgets.QWidget 派生小部件,同时从另一个基础 class、Base.

继承

Base 继承会在调用 QWidget 构造函数时导致错误,说我从未提供 Base 需要的参数。

这就是我尝试调用 QWidgetBase 构造函数的方式:

class Deriv(QtWidgets.QWidget, Base):
    def __init__(self):
        QtWidgets.QWidget.__init__(self)
        Base.__init__(self, "hello world")

我收到的错误是:

    QtWidgets.QWidget.__init__(self)
TypeError: __init__() missing 1 required positional argument: 'id'

是否可以同时继承QWidgetBase,如果可以,如何正确调用它们各自的构造函数?

这是一个重现我遇到的错误的示例应用程序:

#!/usr/bin/env python3
import sys
from PyQt5 import QtWidgets

class Base(object):
    def __init__(self, id):
        self.id = id

class Deriv(QtWidgets.QWidget, Base):
    def __init__(self):
        QtWidgets.QWidget.__init__(self)
        Base.__init__(self, "hello world")

        self.show()

def main():
    app = QtWidgets.QApplication(sys.argv)
    d = Deriv()
    sys.exit(app.exec_())

if __name__ == '__main__':
    main()

这是回溯:

Traceback (most recent call last):
  File "./test.py", line 22, in <module>
    main()
  File "./test.py", line 18, in main
    d = Deriv()
  File "./test.py", line 11, in __init__
    QtWidgets.QWidget.__init__(self)
TypeError: __init__() missing 1 required positional argument: 'id'

请注意,如果我 仅继承自 QWidget(因此只需删除引用 Base 的所有内容),则代码有效

class Deriv(QtWidgets.QWidget):
    def __init__(self):
        QtWidgets.QWidget.__init__(self)

        self.show()

我假设 QtWidgets.QWidget.__init__ 本身使用 super 调用 __init__。对于您的单一继承案例,MRO 由三个 类:[Deriv, QtWidgets.QWidget, object] 组成。调用 super(QtWidgets.QWidget, self).__init__ 将调用 object.__init__,它不需要任何额外的参数。

在您的多重继承示例中,MRO 看起来像

[Deriv, QtWidgets.QWidget, Base, object]

这意味着现在调用super(QtWidgets.QWidget, self).__init__不是指object.__init__,而是Base.__init__确实 需要一个额外的参数,导致您看到的错误。