7

所以...我正在尝试使用 PyQt4 从基本的 Python 转向一些 GUI 编程。我正在看几本不同的书籍和教程,它们似乎都有不同的开始类定义的方式。

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

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)

我仍在尝试围绕类和 OOP 以及所有super()...super()直接调用基类?对于诸如此类的相对简单的示例,即单一继承,使用一种方式与另一种方式有什么真正的好处或理由吗?最后......第二个例子parent作为参数传递给super()而第一个没有......关于为什么/何时/何处合适的任何猜测/解释?

4

1 回答 1

8

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

由于此示例只有单继承,因此与 ;super(Example, self).__init__(parent)完全相同QtGui.QDialog.__init__(self, parent)。前者用于super获取self调用QtGui.QDialog's 方法而不是Example's 的“版本”,因此self自动包含在内,而后者直接调用函数QtGui.QDialog.__init__并显式传递selfandparent参数。在单继承中,AFAIK 没有区别,除了键入的数量以及如果更改继承就必须更改类名这一事实。在多重继承中,super半智能地解析方法。

The third example actually uses QWidget instead of QDialog, which is a little weird; presumably that works because QDialog is a subclass of QWidget and doesn't do anything meaningful in its __init__, but I don't know for sure.

于 2012-07-22T02:50:59.253 回答