关于python:对pyqt4使用__init__的不同方法

Different ways of using __init__ for PyQt4

所以…我正在尝试使用pyqt4从基本的python迁移到一些GUI编程。我在看几本不同的书和教程,它们每一本似乎都有一个稍微不同的方法来启动类定义。

一个教程从类开始,比如:

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

另一本书是这样的:

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

还有一个是这样做的:

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

我仍在努力把我的思想集中在课堂和OOP和super()以及所有…我是否认为第三个示例的最后一行通过直接显式调用基类,或多或少地实现了与前一个示例中使用super()的调用相同的事情?对于这些相对简单的例子,即单继承,有没有真正的好处或理由使用一种方式而不是另一种方式?最后…第二个例子将parent作为super()的参数传递给super(),而第一个例子没有……关于为什么/何时/何地合适的猜测/解释?


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

由于这个例子只有一个继承,所以super(Example, self).__init__(parent)QtGui.QDialog.__init__(self, parent)完全相同;前者使用super得到self的"版本",该版本调用QtGui.QDialog的方法,而不是Example的方法,这样self就自动包含在内,后者直接调用QtGui.QDialog.__init__的函数并显式地tly传递selfparent参数。在单继承中,除了输入的数量和如果更改继承必须更改类名这一事实之外,afaik没有任何区别。在多重继承中,super半智能地解决方法。

第三个例子实际上使用了QWidget,而不是QDialog,这有点奇怪;这可能是因为QDialogQWidget的一个子类,在__init__中没有任何意义,但我不确定。