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传递self和parent参数。在单继承中,除了输入的数量和如果更改继承必须更改类名这一事实之外,afaik没有任何区别。在多重继承中,super半智能地解决方法。
第三个例子实际上使用了QWidget,而不是QDialog,这有点奇怪;这可能是因为QDialog是QWidget的一个子类,在__init__中没有任何意义,但我不确定。
- 你是一个快速回答打字员-远远领先于我
- @问完问题7分钟后,代码猴就来了,没那么快。:)