Python 乘法从QWidget和另一个基类继承?
我试图创建一个PyQt5.qtwidts.QWidget派生的小部件,同时从另一个基类base继承 从Base继承会在调用QWidget构造函数时导致错误,表示我从未提供Base所需的参数 以下是我尝试调用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
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]