PySide6中Qt类多继承的正确使用方法探讨
多继承Qt类与自定义类时的super()调用问题
问题背景
在自定义类与Qt派生类的多继承场景中,使用super()调用基类__init__方法时,自定义类的__init__始终未执行。推测原因是Qt类的构造函数未使用super(),导致MRO链的调用被中断。
无法正常运行的示例
以下代码中,"BASE INIT"从未被打印:
class OptionBase(QWidget): def __init__(self, *args, **kwargs): print("BASE INIT", self) super().__init__(*args, **kwargs) #---------------------------------------------------------------------- class OptionLineEdit(QLineEdit, OptionBase): def __init__(self, *args, **kwargs): super().__init__(*args, **kwargs)
尝试过的失败方案
- 调整基类顺序:程序崩溃或触发异常
- 使用自定义元类:同样导致崩溃,或抛出
RuntimeError: '__init__' method of object's base class (OptionLineEdit) not called这类异常
唯一可行的实现方式
自定义基类不再通过super()调用后续构造函数,避免重复初始化错误;子类中手动调用所有基类的__init__方法:
class OptionBase(QWidget): def __init__(self, *args, **kwargs): print("BASE INIT", self) #---------------------------------------------------------------------- class OptionLineEdit(QLineEdit, OptionBase): def __init__(self, *args, **kwargs): QLineEdit.__init__(self, *args, **kwargs) OptionBase.__init__(self, *args, **kwargs)
疑问
这种手动调用所有基类构造函数的方式是否正确?是否存在其他更优的解决方案?
附:MRO信息
<class 'ui.widgets.option_lineedit.OptionLineEdit'> <class 'PySide6.QtWidgets.QLineEdit'> <class 'ui.widgets.option_base.OptionBase'> <class 'PySide6.QtWidgets.QWidget'> <class 'PySide6.QtCore.QObject'> <class 'PySide6.QtGui.QPaintDevice'> <class 'Shiboken.Object'> <class 'object'>
内容的提问来源于stack exchange,提问作者GrAnd
相关产品推荐
相关产品推荐

