PySide,PysideUIC和多重继承

E.B*_*ach 5 python inheritance pyside python-2.7

我有一个继承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_())
Run Code Online (Sandbox Code Playgroud)

当我尝试扩展MainDialogWorker,super不调用Worker's __init__和print dlg.data失败,因为"AttributeError:'MainDialog'对象没有属性'data'"

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

QtGui.QDialog.__init__(self)
Worker.__init__(self)
Run Code Online (Sandbox Code Playgroud)

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

这适用于Python 2.7.

jus*_*gel 1

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

class MainDialog(QtGui.QDialog, Worker, Ui_Dialog):
Run Code Online (Sandbox Code Playgroud)

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

class MainDialog(QtGui.QDialog, Worker, Ui_Dialog):
    super().__init__()
Run Code Online (Sandbox Code Playgroud)

我相信您在 2.7 中调用 init 的方式是正确的做法。类似的问题比比皆是。这是一个常见问题,称为钻石问题Python 超级方法和调用替代方法可能会更解释一些事情。