繁体   English   中英

从QWidget和另一个基类继承吗?

[英]Multiply inherit from QWidget and another base class?

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

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

这是我尝试调用QWidgetBase构造函数的方式:

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'

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

这是一个示例应用程序,可重现我遇到的错误:

#!/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__ ,它确实需要附加参数,从而导致您看到错误。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM