Diferentes formas de usar __init__ para PyQt4

Entonces … estoy trabajando para intentar pasar de Python básico a alguna progtwigción GUI, usando PyQt4. Estoy viendo un par de libros y tutoriales diferentes, y cada uno parece tener una forma ligeramente diferente de comenzar la definición de clase.

Un tutorial comienza las clases así:

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

Otro libro lo hace así:

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

Y otro más lo hace de esta manera:

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

Todavía estoy tratando de envolver mi mente en torno a las clases, OOP y super() y todo … estoy en lo cierto al pensar que la última línea del tercer ejemplo logra más o menos lo mismo que las llamadas que usan super() en Los anteriores, ¿llamando explícitamente a la clase base directamente? Para ejemplos relativamente simples como estos, es decir, herencia única, ¿hay algún beneficio real o una razón para usar una forma en lugar de la otra? Finalmente … el segundo ejemplo pasa al parent como argumento a super() mientras que el primero no … ¿alguna conjetura / explicación de por qué / cuándo / dónde sería apropiado?

El primero simplemente no admite pasar un argumento parent a su clase base. Si sabes que nunca necesitarás el argumento parent , está bien, pero esto es menos flexible.

Como este ejemplo solo tiene una herencia, super(Example, self).__init__(parent) es exactamente igual que QtGui.QDialog.__init__(self, parent) ; el primero usa super para obtener una “versión” de self que QtGui.QDialog los métodos de QtGui.QDialog lugar de los de Example , de modo que ese self se incluye automáticamente, mientras que el último llama directamente a la función QtGui.QDialog.__init__ y pasa explícitamente al self y parent argumentos de los parent . En la herencia única no hay diferencia AFAIK aparte de la cantidad de escritura y el hecho de que tiene que cambiar el nombre de la clase si cambia la herencia. En herencia múltiple, los super resuelve los métodos de manera semi-inteligente.

El tercer ejemplo realmente usa QWidget lugar de QDialog , que es un poco raro; presumiblemente eso funciona porque QDialog es una subclase de QWidget y no hace nada significativo en su __init__ , pero no estoy seguro.