2012-07-22 36 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