首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >问答首页 >从QWidget和另一个基类的乘法继承?

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

Stack Overflow用户
提问于 2018-10-10 17:06:26
回答 1查看 735关注 0票数 0

我正在尝试创建一个PyQt5.QtWidgets.QWidget派生的小部件,同时继承另一个基类Base

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

以下是我试图调用QWidgetBase构造函数的方式:

代码语言:javascript
代码运行次数:0
运行
复制
class Deriv(QtWidgets.QWidget, Base):
    def __init__(self):
        QtWidgets.QWidget.__init__(self)
        Base.__init__(self, "hello world")

我所犯的错误是:

代码语言:javascript
代码运行次数:0
运行
复制
    QtWidgets.QWidget.__init__(self)
TypeError: __init__() missing 1 required positional argument: 'id'

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

下面是一个示例应用程序,它复制了我正在经历的错误:

代码语言:javascript
代码运行次数:0
运行
复制
#!/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()

这是回溯:

代码语言:javascript
代码运行次数:0
运行
复制
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的所有内容),那么代码就能工作了。

代码语言:javascript
代码运行次数:0
运行
复制
class Deriv(QtWidgets.QWidget):
    def __init__(self):
        QtWidgets.QWidget.__init__(self)

        self.show()
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2018-10-10 17:36:37

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

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

代码语言:javascript
代码运行次数:0
运行
复制
[Deriv, QtWidgets.QWidget, Base, object]

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

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/52745442

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档