2012-07-18 18 views
5

tengo 3 clases A, B y D como se indica a continuaciónPython La herencia múltiple

class A(object): 
    def test(self): 
     print "called A" 

class B(object): 
    def test(self): 
     print "called B" 

class D(A,B): 
    def test(self): 
     super(A,self).test() 

inst_d=D() 
inst_d.test() 

---------------------------------------- 
Output: 
    called B 

Pregunta: En D.test(), yo estoy llamando super(A,self).test(). ¿Por qué solo se llama a B.test() aunque el método A.test() también exista?

+1

La forma súper obras de Python es algo no evidente. Una gran guía práctica sobre cómo usarla correctamente es esta: http://rhettinger.wordpress.com/2011/05/26/super-considered-super/ – millimoose

Respuesta

6

Porque le ha dicho que no lo haga. En D.test, le indicó que llame al método de prueba del padre de A, eso es lo que hace super.

Normalmente desea utilizar el nombre de clase actual en la llamada super.

+0

Además, las otras clases también deben llamar 'super()' a obtener la próxima clase en el MRO. – kindall

+0

Y "normalmente" podría ser "casi siempre"; un caso de uso hipotético para saltar a un lugar aleatorio en el orden de resolución del método probablemente sería bastante exótico. – millimoose

+2

La respuesta es un poco confusa: 'B' no es el padre de' A', por lo que no es obvio por qué se llama 'B.test()'. –

0

super(A,self).test() significa: llame al método test del objeto después de A en el orden de resolución de método self (mro).

usando D.__mro__ que ver el orden de la resolución del método es:

<class '__main__.D'>, <class '__main__.A'>, <class '__main__.B'>, <type 'object'> 

Así test de B se llama.

En Python 3 solo tiene que escribir super().test() y hace lo que quiere. En Python 2 necesita escribir: super(D,self).test()

0

Normalmente, el super se llama con el nombre de la clase actual y deja que el MRO de python cuide a qué clase primaria debe llamar según el algoritmo que sigue. Entonces su código se verá así, por el comportamiento que pretende.

class D(A,B): 
    def test(self): 
     super(D,self).test() 

Nota super(D,self).test()