You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.07 07:13:29