2011-10-02 18 views
15

A:Python: super y __init __() vs __init __ (self)

super(BasicElement, self).__init__() 

B:

super(BasicElement, self).__init__(self) 

¿Cuál es la diferencia entre A y B? La mayoría de los ejemplos con los que me encuentro utilizan A, pero me encuentro con un problema donde A no llama a la función primaria __init__, pero B sí. ¿Por qué podría ser esto? ¿Cuál debería usarse y en qué casos?

+1

Mostrar el código donde funciona 'B'. ¿Qué quiere decir con "' A' no está llamando "? ¿Le da un error? ¿Lo que pasa? ¿'A .__ init__' toma un parámetro que no sea' self'? – agf

Respuesta

23

No debería necesitar hacer esa segunda forma, a menos que de alguna manera la clase de BasicElement __init__ tome un argumento.

class A(object): 
    def __init__(self): 
     print "Inside class A init" 

class B(A): 
    def __init__(self): 
     super(B, self).__init__() 
     print "Inside class B init" 

>>> b = B() 
Inside class A init 
Inside class B init 

O con las clases que necesitan argumentos init:

class A(object): 
    def __init__(self, arg): 
     print "Inside class A init. arg =", arg 

class B(A): 
    def __init__(self): 
     super(B, self).__init__("foo") 
     print "Inside class B init" 

>>> b = B() 
Inside class A init. arg = foo 
Inside class B init  
+5

Importante acerca de esta construcción es que la superclase A debe derivarse explícitamente del objeto. Simplemente declarar 'clase A:' levantará la excepción 'TypeError: debe ser type, no classobj' cuando se invoca la llamada super init. – parvus

+0

¡La clase A debe derivar del objeto! ¡La clase A debe derivar del objeto! ¡La clase A debe derivarse del objeto! Repita por tres veces para aviso. – bourneli

Cuestiones relacionadas