2012-07-22 79 views
7

所以...我正在尝试使用PyQt4从基本的Python转移到一些GUI编程。我正在看几本不同的书籍和教程,而且他们每个人似乎都有一个稍微不同的启动班级定义的方式。PyQt4使用__init__的不同方式

一个教程开始了类,像这样:

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(),而第一个例子不......对于为什么/何时/在何处适合的猜测/解释?

回答

8

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

由于此示例仅具有单继承,因此super(Example, self).__init__(parent)QtGui.QDialog.__init__(self, parent)完全相同;前者使用super来获取卡列斯QtGui.QDialog的方法,而不是Example的,让self自动包含的self一个“版本”,而后者则直接调用该函数QtGui.QDialog.__init__并明确传递selfparent参数。在单继承中,除了键入的数量以外,没有区别AFAIK,而且如果更改继承,则必须更改类名称。在多重继承中,super半智能地解决方法。

第三个例子实际上使用QWidget而不是QDialog,这有点奇怪;据推测这是有效的,因为QDialogQWidget的一个子类别,并且在__init__中没有做任何有意义的事情,但我不确定。

+0

你是一个*快速*答案typer - 在我之前的方式 – Hubro 2012-07-22 02:51:43

+1

@Codemonkey问题提出后7分钟,而不是*快*。 :) – Dougal 2012-07-22 02:55:53