Ver Mensaje Individual
  #9 (permalink)  
Antiguo 15/08/2014, 11:30
AlvaroG
Invitado
 
Mensajes: n/a
Puntos:
Respuesta: Consultas sobre wxPython

No vas mal rumbeado, pero no es por un tema de parámetros que se incluye u omite la llamada a super().
Si tenés una clase A y una B(A), no es raro que necesites inicializar tu clase B con alguna cosa extra que A no hace, y por eso necesites definir __init__, pero a su vez necesites que A haga lo que debe hacer, y por eso además incluyas la llamada a super().

Si cada clase define su __init__, entonces al crear un objeto de clase B, el __init__ de A no es invocado. Solamente es invocado si B no define su __init__ propio.

Te agrego un par de ejemplos simples para que quede claro:

Código Python:
Ver original
  1. # clase base para el ejemplo
  2. >>> class A(object):
  3. ...   def __init__(self):
  4. ...     print 'init A'
  5. ...
  6. >>> class B(A):
  7. ...   def __init__(self):
  8. ...     print 'init B'
  9. ...
  10. >>> B()
  11. init B # B no llama al __init__ de A mediante super()
  12.  
  13. >>> class C(A):
  14. ...   pass
  15. ...
  16. >>> C()
  17. init A # C no define __init__, corre el de A
  18.  
  19. >>> class D(A):
  20. ...   def __init__(self):
  21. ...     super(D, self).__init__()
  22. ...     print 'init D'
  23. ...
  24. >>> D()
  25. init A
  26. init D # D y A definen __init__, y D llama al de A
  27.  
  28. >>> class E(D):
  29. ...   def __init__(self):
  30. ...     super(E, self).__init__()
  31. ...     print 'init E'
  32. ...
  33. >>> E()
  34. init A
  35. init D
  36. init E #gracias a las sucesivas llamadas a super() en cada clase, corren todos los __init__
  37.  
  38. >>> class F(E):
  39. ...   def __init__(self):
  40. ...     super(E, self).__init__()
  41. ...     print 'init F'
  42. ...
  43. >>> F()
  44. init A
  45. init D
  46. init F # al llamar a super(E) en vez de super(F), salteamos el __init__ de E