[英]Multiply inherit from QWidget and another base class?
我正在嘗試創建派生PyQt5.QtWidgets.QWidget
小部件,同時從另一個基類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__
,它確實需要附加參數,從而導致您看到錯誤。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.