Python 乘法从QWidget和另一个基类继承?

Python 乘法从QWidget和另一个基类继承?,python,pyqt,pyqt5,multiple-inheritance,Python,Pyqt,Pyqt5,Multiple Inheritance,我试图创建一个PyQt5.qtwidts.QWidget派生的小部件,同时从另一个基类base继承 从Base继承会在调用QWidget构造函数时导致错误,表示我从未提供Base所需的参数 以下是我尝试调用QWidget和基本构造函数的方式: class Deriv(QtWidgets.QWidget, Base): def __init__(self): QtWidgets.QWidget.__init__(self) Base.__init__(sel

我试图创建一个PyQt5.qtwidts.QWidget派生的小部件,同时从另一个基类base继承

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

以下是我尝试调用QWidget和基本构造函数的方式:

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'
可以从QWidget和Base继承吗?如果可以,如何正确调用它们各自的构造函数

下面是一个示例应用程序,它再现了我遇到的错误:

#!/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'
我假设qtwidts.QWidget.\uuuu init\uuuu本身使用super来调用\uuuu init\uuuu。对于单个继承案例,MRO由三个类组成:[Deriv,qtwidts.QWidget,object]。调用superQtWidgets.QWidget,self.\uu init\uuuuuuu将调用object.\uuuu init\uuuuuuu,它不需要任何附加参数

在多重继承示例中,MRO如下所示

[Deriv, QtWidgets.QWidget, Base, object]

这意味着现在调用superQtWidgets.QWidget,self.\uuu init\uuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuu;您需要将self.id作为参数传递给qtwidts.QWidget.\uuuu init\uuuu.QWidget不接受id参数。这是错误:TypeError:QWidgetparent:QWidget=None,flags:Union[Qt.WindowFlags,Qt.WindowType]=Qt.WindowFlags:参数1具有意外的类型'str'@chepner我已更新问题,以显示不向QWidget传递任何内容都有效,但仅当我不从其他任何东西继承时。QWidget显然使用super,因此,如果您有额外的基类,那么它们的uu init_u方法将从QTWidgest.QWidget.调用。一旦我找到QTWidgets的源代码,我就可以发布一个这样的答案。@MartijInputers QTWidgets.QWidget确实有一个父项,但它默认为“无”-为了简洁起见,我已将其删除-将其添加回不会有任何区别,正如我在另一个问题的答案中所建议的那样,我尝试过使用qtwidts.QWidget.\uuuuu init\uuuu self而不是super,但这似乎不起作用。不,它不起作用,因为即使你不调用super,qtwidts.QWidget.\uuuuuu init\uuuuuuu确实起作用,或者至少,我认为是这样,基于观察到的行为。super的规则是,涉及的每个类都必须使用它,或者没有一个可以使用。文档中确认:该规则的推论是,您需要将调用uu init uu收到的每个参数传递给super调用,因为您不知道在链的更上层调用需要哪些参数。推论的例外是,如果您是某个特定方法的根类,则可以忽略特定于继承树分支的参数。但是,对象始终是uu init uuu的根,所以您所能做的就是容忍意外参数并将其传递。
[Deriv, QtWidgets.QWidget, Base, object]