python - PySide、PysideUIC 和多重继承

标签 python inheritance python-2.7 pyside

我有一个对话框类继承了 pyside-uic 生成的 python 类,但我的问题是它不能扩展我添加另一个基类。

import sys
from PySide import QtGui
from mi_ui import Ui_Dialog

class Worker(object):
    def __init__(self):
        super(Worker, self).__init__()
        self.data = 1

class MainDialog(QtGui.QDialog, Ui_Dialog, Worker):
    def __init__(self):
        super(MainDialog, self).__init__()
        self.setupUi(self)

if __name__ == '__main__':
    app = QtGui.QApplication(sys.argv)
    dlg = MainDialog()
    print dlg.data
    dlg.show()

    sys.exit(app.exec_())

当我尝试使用 Worker 扩展 MainDialog 时,super 不会调用 Worker__init__ 并且打印 dlg.data 失败,因为“AttributeError: 'MainDialog' object has no attribute 'data'”

我唯一的解决方法似乎是忽略 super 并手动调用每个 __init__

QtGui.QDialog.__init__(self)
Worker.__init__(self)

这是我唯一的解决方案吗?

这是针对 Python 2.7 的。

最佳答案

多重继承在 Python 中很棘手。如果您希望它完美地工作,您继承的类不能有任何冲突。在大多数情况下,pyside 的多重继承确实会导致冲突,因为一切都继承 QObject 提供相同的变量和方法。 Python 不知道继承哪一个。这幅画是另一个冲突领域。另一件要考虑的事情是继承的顺序。我相信 python 从左到右尝试继承和初始化。因此,如果您只想要 QtGui.QDialog 和 Worker 的 init 方法(Ui_Dialog 可能会发生冲突),那么您可能想尝试一下。

class MainDialog(QtGui.QDialog, Worker, Ui_Dialog):

在 python 3 中,您可以稍微不同地调用 super 方法。

class MainDialog(QtGui.QDialog, Worker, Ui_Dialog):
    super().__init__()

我相信您为 2.7 调用 init 的方式是正确的做事方式。类似这样的问题比比皆是。这是一个常见问题,称为 Diamond problem . Python super method and calling alternatives可以稍微解释一下。

关于python - PySide、PysideUIC 和多重继承,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20477446/

相关文章:

python - tkinter 中的单独随机数

python - 运行 unittest discover 忽略特定目录

python - 调试 Python fatal error : GC Object already Tracked

python - 如何通过 Python 使用 Firebird 审计和跟踪服务?

Java 类继承问题 : Syntax error on token "{", { 应在此标记之后

inheritance - 用例中的扩展与泛化

python - 如何在python中动态转义/输入文件名

python - pyfribidi for windows 或任何其他 bidi 算法

python - 什么是 DT_VARIANT 张量?

javascript - 检查元素继承了哪些属性