Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/342.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python PySide、PysideUIC和多重继承_Python_Inheritance_Python 2.7_Pyside - Fatal编程技术网

Python PySide、PysideUIC和多重继承

Python PySide、PysideUIC和多重继承,python,inheritance,python-2.7,pyside,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(QtG

我有一个对话框类,它继承了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
\uuuuu init\uuuuuu
并且打印dlg.data失败,因为“AttributeError:'MainDialog'对象没有属性'data'

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

QtGui.QDialog.__init__(self)
Worker.__init__(self)
这是我唯一的解决办法吗


这是针对Python2.7的。

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

class MainDialog(QtGui.QDialog, Worker, Ui_Dialog):
在Python3中,可以稍微不同地调用super方法

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

我相信你为2.7调用init的方式是正确的做法。类似的问题到处都是。这是一个常见的问题,被称为。可能会解释得更详细一些。

Worker
作为第一个基类:

class MainDialog(Worker, QtGui.QDialog, Ui_Dialog)
这仍然会导致先调用
MainDialog.\uuuuu init\uuuu
,然后调用
Worker.\uuuuuu init\uuuu
(可以查看是否添加了一些打印语句)。但是您仍然可以从
main对话框中访问
数据
属性

Ui\u对话框
类实际上并不在其中,因为它只是从
对象
继承的一个普通python类,并且从不调用
super
。因此,它可以按照基类顺序去任何你喜欢的地方


显然,如果您这样做,您必须注意不要从
Worker
类中的其他基类中删除任何方法-但是您已经有了这个“问题”(只是顺序不同)。

但是请注意
super()适当地实现它们的构造函数(例如接受
**关键字
并将其转发到下一个
super()
)。Qt类的PySide包装器似乎不是这样。就我的经验而言,
super()
不适用于Qt的PySide包装器,我认为PyQt在这里没有任何不同。因此,手动调用
\uuuu init\uuuu
可能是您唯一的方法。只是要确保避免(或绕过)菱形继承。