簡體   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