2012-07-22 8 views
7

Así que ... Estoy trabajando para intentar pasar de la Python básica a la programación de la GUI, usando PyQt4. Estoy buscando un par de libros y tutoriales diferentes, y cada uno parece tener una forma ligeramente diferente de iniciar la definición de la clase.Diferentes formas de usar __init__ para PyQt4

Un tutorial comienza las clases de este modo:

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

Otro libro hace como este:

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

Y otro lo hace de esta manera:

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

I Todavía estoy tratando de concentrarme en las clases y OOP y super() y todo ... ¿estoy en lo correcto al pensar que la última línea del tercer ejemplo logra más o menos lo mismo que las llamadas usando super() en las 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 razón para usar una forma vs. la otra? Finalmente ... el segundo ejemplo pasa parent como argumento a super() mientras que el primero no ... ¿adivinanzas/explicaciones sobre por qué/cuándo/dónde eso sería apropiado?

Respuesta

8

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

Dado que este ejemplo solo tiene herencia simple, super(Example, self).__init__(parent) es exactamente igual que QtGui.QDialog.__init__(self, parent); El primero utiliza super para obtener una "versión" de self que Calles QtGui.QDialog 's métodos en lugar de Example' s, por lo que self se incluye de forma automática, mientras que el segundo llamadas directamente la función QtGui.QDialog.__init__ y explícitamente pasa los self y parent argumentos. En la herencia individual no hay diferencia AFAIK aparte de la cantidad de tipeo y el hecho de que debe cambiar el nombre de la clase si cambia la herencia. En la herencia múltiple, super resuelve los métodos semi-inteligentemente.

El tercer ejemplo realmente usa QWidget en lugar de QDialog, lo cual 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.

+0

Eres una respuesta * rápida * typer - camino delante de mí – Hubro

+1

@Codemonkey 7 minutos después de que se hizo la pregunta, no * que * rápido. :) – Dougal

Cuestiones relacionadas