Python PySide、PysideUIC和多重继承
我有一个对话框类,它继承了pyside uic生成的python类,但我的问题是,在添加另一个基类时,它无法扩展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
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
可能是您唯一的方法。只是要确保避免(或绕过)菱形继承。