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.