Похоже, я наткнулся на метаклассовый ад, даже когда я не хотел иметь с ним ничего общего.
Я пишу приложение в Qt4 с помощью PySide. Я хочу отделить управляемую событиями часть от определения пользовательского интерфейса, которая создается из файлов Qt Designer. Поэтому я создаю классы "контроллера", но чтобы облегчить жизнь, я все равно их наследую. Пример:
class BaseController(QObject):
def setupEvents(self, parent):
self.window = parent
class MainController(BaseController):
pass
class MainWindow(QMainWindow, Ui_MainWindow, MainController):
def __init__(self, parent=None):
super(MainWindow, self).__init__(parent)
self.setupUi(self)
self.setupEvents(self)
Это работает так, как ожидалось. Он также имеет наследование от (QDialog
, Ui_Dialog
, BaseController
). Но когда я подклассом BaseController
и пытаюсь наследовать от указанного подкласса (вместо BaseController
), я получаю сообщение об ошибке:
TypeError: ошибка при вызове баз метакласса metaclass: метакласс производного класса должен быть (нестрогим) подклассом метаклассов всех его оснований
Уточнение: оба QMainWindow
и QDialog
наследуются от QObject
. BaseController
должен также наследовать от него из-за особенностей системы событий Qt. Классы Ui_ наследуются только от простого класса объектов Python. Я искал решения, но все они включают случаи намеренного использования метаклассов. Поэтому я должен делать что-то ужасное.
EDIT: Мое описание может быть более четким путем добавления графиков.
Рабочий пример:
QObject
| \___________________
| object |
QMainWindow | BaseController
| /---Ui_MainWindow |
| | MainController
MainWindow-----------------/
Другой рабочий пример:
QObject
| \___________________
| object |
QDialog | BaseController
| /---Ui_OtherWindow |
| | |
OtherWindow----------------/
Не работает пример:
QObject
| \___________________
| object |
QDialog | BaseController
| /---Ui_OtherWindow |
| | OtherController
OtherWindow----------------/