看起来我偶然发现了一个元类地狱,即使我不想与之有任何关系。
我正在使用 PySide 在 Qt4 中编写一个应用程序。我想将事件驱动部分与 UI 定义分开,UI 定义是从 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:调用元类基时出错
元类冲突:派生类的元类必须是其所有基类的元类的(非严格)子类
澄清:两者都有QMainWindow
and 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----------------/