【发布时间】:2011-09-27 07:06:24
【问题描述】:
看起来我偶然发现了一个元类地狱,即使我不想与它有任何关系。
我正在使用 PySide 在 Qt4 中编写一个应用程序。我想将事件驱动部分与从 Qt Designer 文件生成的 UI 定义分开。因此,我创建了一个“控制器”类,但为了简化我的生活,我还是多重继承了它们。一个例子:
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 和 QDialog 都继承自 QObject。由于 Qt 事件系统的特性,BaseController 也必须从它继承。 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----------------/
【问题讨论】:
-
我不太擅长 Python 元类,但我认为问题可能在于您的
MainWindow类定义中父类的排序。只是猜测。 -
最让我困惑的是 MainWindow 工作,同时将 QDialog、Ui_Dialog 和控制器置于相同的顺序:从 QObject 继承的类、从对象继承的类、从 QObject 继承的类 - 出于某种原因失败。
-
我不了解python,但是在C++/Qt 中,严格禁止从QObject 进行多重继承。我想知道您是否也遇到了同样的问题,而且它恰好在您的某些情况下有效。
-
如果您在多重继承方面遇到问题,那么作为备用方案,您始终可以使用单继承和 3 个相互引用的不同对象。
-
伙计,这是我在这里看到的最可怕的问题标题之一!
标签: python oop qt4 multiple-inheritance metaclass