使用__init__ for PyQt4的不同方法

mem*_*nuk 7 python pyqt super pyqt4

所以......我正在尝试使用PyQt4从基本的Python转向一些GUI编程.我正在看几本不同的书籍和教程,他们每个人似乎都有一种稍微不同的方式来推动课程定义.

一个教程从这样的类开始:

class Example(QtGui.QDialog):
    def __init__(self):
        super(Example, self).__init__()
Run Code Online (Sandbox Code Playgroud)

另一本书是这样的:

class Example(QtGui.QDialog):
    def __init__(self, parent=None):
        super(Example, self).__init__(parent)
Run Code Online (Sandbox Code Playgroud)

而另一个是这样做的:

class Example(QtGui.QDialog):
    def__init__(self, parent=None):
        QtGui.QWidget.__init__(self, parent)
Run Code Online (Sandbox Code Playgroud)

我仍然在试图总结我的脑海围绕类和OOP和super()所有......我在想,在第三个例子中的最后一行完成或多或少同样的事情,使用呼叫纠正super()在前面的,通过明确直接调用基类?对于这些相对简单的例子,即单一继承,是否有任何真正的好处或理由使用单向与另一种方式?最后......第二个例子parent作为一个参数传递,super()而第一个例子没有...任何关于为什么/何时/哪里合适的猜测/解释?

Dou*_*gal 8

第一个根本不支持将parent参数传递给它的基类.如果你知道你永远不需要parentarg,那很好,但这不太灵活.

由于此示例仅具有单继承,super(Example, self).__init__(parent)因此完全相同QtGui.QDialog.__init__(self, parent); 前者用于super获取selfcalles QtGui.QDialog方法的"版本" 而不是Example's,因此self自动包含,而后者直接调用函数QtGui.QDialog.__init__并显式传递selfparent参数.在单继承中,除了键入的数量之外,AFAIK没有区别,如果更改继承,则必须更改类名.在多重继承中,super半智能地解析方法.

实际上使用的第三个例子QWidget代替了QDialog,这有点奇怪; 大概是有效的,因为它QDialog是一个子类,QWidget并没有做任何有意义的事情__init__,但我不确定.