2012-07-22 5 views
7

Quindi ... Sto lavorando per provare a passare dal Python di base a qualche programmazione della GUI, usando PyQt4. Sto guardando un paio di libri e tutorial diversi, e ognuno di loro sembra avere un modo leggermente diverso di dare il via alla definizione della classe.Diversi modi di usare __init__ per PyQt4

Un'esercitazione inizia le classi in questo modo:

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

Un altro libro lo fa in questo modo:

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

E ancora un altro lo fa in questo modo:

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

I sto ancora cercando di avvolgere la mia mente su classi e OOP e super() e tutti ... ho ragione nel pensare che l'ultima riga del terzo esempio realizza più o meno la stessa cosa delle chiamate usando super() nelle precedenti, chiamando esplicitamente la classe base direttamente? Per esempi relativamente semplici come questi, vale a dire l'ereditarietà singola, esiste un reale vantaggio o motivo per usare l'uno contro l'altro? Infine ... il secondo esempio passa a parent come argomento a super() mentre il primo non ... indovina/spiega perché/quando/dove sarebbe appropriato?

risposta

8

Il primo semplicemente non supporta il passaggio di un argomento parent alla sua classe base. Se sai che non avrai mai bisogno dello parent arg, va bene, ma questo è meno flessibile.

Poiché questo esempio ha solo ereditarietà singola, super(Example, self).__init__(parent) è esattamente lo stesso di QtGui.QDialog.__init__(self, parent); il primo utilizza super per ottenere una "versione" di self che calles QtGui.QDialog 's metodi, invece di Example' s, in modo che self è incluso automaticamente, mentre il secondo chiama direttamente la funzione QtGui.QDialog.__init__ ed esplicitamente passa i self e parent argomenti. Nell'ereditarietà singola non c'è differenza AFAIK oltre alla quantità di digitazione e al fatto che è necessario modificare il nome della classe se si modifica l'ereditarietà. Nell'ereditarietà multipla, super risolve i metodi in modo semi-intelligente.

Il terzo esempio utilizza effettivamente QWidget anziché QDialog, che è un po 'strano; presumibilmente funziona perché QDialog è una sottoclasse di QWidget e non fa nulla di significativo nel suo __init__, ma non lo so per certo.

+0

Sei un * veloce * risposta typer - strada davanti a me – Hubro

+1

@Codemonkey 7 minuti dopo la domanda è stata posta, non * che * veloce. :) – Dougal