我正在尝试创建一个PyQt5.QtWidgets.QWidget
派生的小部件,同时继承另一个基类Base
。
从Base
继承会导致调用QWidget
构造函数时出错,说我从未提供Base
所需的参数。
以下是我试图调用QWidget
和Base
构造函数的方式:
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'
注意,如果我只从QWidget
继承(所以只删除引用Base
的所有内容),那么代码就能工作了。
class Deriv(QtWidgets.QWidget):
def __init__(self):
QtWidgets.QWidget.__init__(self)
self.show()
发布于 2018-10-10 09:36:37
我假设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__
,这确实需要一个额外的参数,从而导致您看到的错误。
https://stackoverflow.com/questions/52745442
复制相似问题