代码之家  ›  专栏  ›  技术社区  ›  Steve Lorimer

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

  •  0
  • Steve Lorimer  · 技术社区  · 7 年前

    我想创造一个 PyQt5.QtWidgets.QWidget 派生的小部件,同时从另一个基类继承, Base .

    继承自 底座 在调用 QWidget 构造函数,说我从来没有提供 底座

    我试着这样称呼 底座

    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工具 底座 ,如果是,如何正确调用它们各自的构造函数?

    下面是一个示例应用程序,它再现了我遇到的错误:

    #!/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工具 (所以删除所有涉及 底座 ),则代码工作

    class Deriv(QtWidgets.QWidget):
        def __init__(self):
            QtWidgets.QWidget.__init__(self)
    
            self.show()
    
    1 回复  |  直到 7 年前
        1
  •  1
  •   chepner    7 年前

    我猜 QtWidgets.QWidget.__init__ super 打电话 __init__ . 对于单个继承案例,MRO由三个类组成: [Deriv, QtWidgets.QWidget, object] super(QtWidgets.QWidget, self).__init__ 我会打电话的 object.__init__ ,不需要任何附加参数。

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

    [Deriv, QtWidgets.QWidget, Base, object]
    

    这意味着 现在 电话 超级(qtwidts.QWidget,self).\u初始化__ 指的不是 对象。\u初始化__ ,但是 Base.__init__ ,其中 需要一个额外的参数,导致您看到的错误。