Это делает решение трехстрочным и довольно понятным.

е, я наткнулся на ад метакласса, даже когда не хотел иметь с этим ничего общего.

Я пишу приложение в 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) Я получаю сообщение об ошибке:

Ошибка типа: ошибка при вызове конфликта метакласса баз метаклассов: метакласс производного класса должен быть (нестрогим) подклассом метаклассов всех его баз

Пояснение: обаQMainWindow а такжеQDialog наследовать отQObject. BaseController также должен наследовать от него из-за особенностей системы событий Qt. Классы Ui_ наследуются только от простого класса объектов Python. Я искал решения, но все они включают случаи преднамеренного использования метаклассов. Поэтому я, должно быть, делаю что-то ужасно неправильно.

РЕДАКТИРОВАТЬ: мое описание может быть понятнее, добавив графики.

Рабочий пример:

QObject
|      \___________________
|            object        |
QMainWindow     |          BaseController
|      /---Ui_MainWindow   |
|      |                   MainController
MainWindow-----------------/

Еще один рабочий пример:

QObject
|      \___________________
|            object        |
QDialog         |          BaseController
|      /---Ui_OtherWindow  |
|      |                   |
OtherWindow----------------/

Не рабочий пример:

QObject
|      \___________________
|            object        |
QDialog         |          BaseController
|      /---Ui_OtherWindow  |
|      |                   OtherController
OtherWindow----------------/

Ответы на вопрос(2)

Ваш ответ на вопрос