乘法继承QWidget和另一个基class?
Multiply inherit from QWidget and another base class?
我正在尝试创建一个 PyQt5.QtWidgets.QWidget
派生小部件,同时从另一个基础 class、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()
我假设 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__
,确实 需要一个额外的参数,导致您看到的错误。
我正在尝试创建一个 PyQt5.QtWidgets.QWidget
派生小部件,同时从另一个基础 class、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()
我假设 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__
,确实 需要一个额外的参数,导致您看到的错误。