PyQt4中使用__init__的不同方式

7

所以...我正在努力从基础的Python转向一些GUI编程,使用PyQt4。我正在查看几本不同的书籍和教程,它们似乎都有稍微不同的方式来启动类定义。

其中一个教程是这样开始定义类的:

class Example(QtGui.QDialog):
    def __init__(self):
        super(Example, self).__init__()

另一本书是这样做的:

class Example(QtGui.QDialog):
    def __init__(self, parent=None):
        super(Example, self).__init__(parent)

还有一种方法是这样的:

class Example(QtGui.QDialog):
    def__init__(self, parent=None):
        QtGui.QWidget.__init__(self, parent)

我仍在努力理解类和面向对象编程以及super()等内容... 我是否正确地认为第三个示例的最后一行通过直接调用基类显式实现的方式,与前面使用super()进行调用的效果差不多?对于这些相对简单的示例,即单继承,使用一种方法而不是另一种方法是否有真正的好处或原因?最后...第二个示例将parent作为参数传递给super(),而第一个示例没有... 你有何猜测/解释何时/何地使用该方法会更合适?

1个回答

8
第一个例子简单地不支持将parent参数传递给基类。如果你知道你永远不需要parent参数,那很好,但这就变得不太灵活了。
由于该示例只有单一继承,super(Example,self).__init__(parent)QtGui.QDialog.__init__(self,parent)完全相同;前者使用super来获取一个"版本"的self,该版本调用QtGui.QDialog的方法而不是Example的方法,以便自动包含self,而后者直接调用函数QtGui.QDialog.__init__并显式地传递selfparent参数。在单一继承中,我认为除了打字量和如果更改继承则必须更改类名之外,没有其他区别。在多重继承中,super会半智能地解决方法。
第三个示例实际上使用的是QWidget而不是QDialog,这有点奇怪;可能这能工作是因为QDialogQWidget的子类,在其__init__中没有做任何有意义的事情,但我不确定。

你是一个快速的回答打字者 - 超过了我很多。 - Hubro
1
@Codemonkey 问题提出后7分钟,不算快。 :) - Danica

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接