Умножить наследовать от QWidget и другого базового класса? - PullRequest
0 голосов
/ 10 октября 2018

Я пытаюсь создать производный виджет 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")

Ошибка I 'm get говорит:

    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()

1 Ответ

0 голосов
/ 10 октября 2018

Я предполагаю, что 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__, что требует дополнительного аргумента, приводящего к появившейся ошибке.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...