2011-05-19 13 views
6

Por lo que yo puedo decir, y todo lo que he ido encontrando en línea, esto debería funcionar (pero no lo hace, es por eso que estoy pidiendo aquí;))Python super() - debería estar funcionando pero no es?

class Tigon(Crossbreeds, Predator, Lion): 

    def __init__(self): 
     super().__init__() 
    def printSize(self): 
     print("Huge") 

Ambos "Cruces" y "Predator" hereda de "Mamífero" y "León" hereda de Predator. La compilación de esos trabajos está bien. Estoy trabajando en Python 3.2, aunque también lo intenté antes:

Editar: Lo siento, parte de mi publicación no apareció por algún motivo.

También probé:

class Tigon(Crossbreeds, Predator, Lion): 

    def __init__(self): 
     super(Tigon, self).__init__() 
    def printSize(self): 
     print("Huge") 

y dos de ellos me dio:

class Tigon(Crossbreeds, Predator, Lion): 
TypeError: Cannot create a consistent method resolution 
order (MRO) for bases Predator, Mammal, Lion 

¿Alguna sugerencia?

+0

Tienes que escribir exactamente lo que no funciona para que podamos ayudarte. También 'super()' normalmente toma argumentos: http://docs.python.org/library/functions.html#super – viraptor

+0

Lo sentimos, parte de la publicación no apareció. Editado ahora – BIU

+0

@viraptor: super() en python 3 no necesita argumentos (aunque aún puede tomarlos) y podría tener sentido especificarlos si no funciona sin. –

Respuesta

0

Debe ser super().__init__(self).

Editado: Mi disculpas, se debería poner Lion frontal:

class Tigon(Lion, Predator, Crossbreeds): 
    def __init__(self): 
     super().__init__() 
+0

Eso me da la mismo error – BIU

+0

@Jan - ¿puede decir cuál es el problema? – BIU

+0

@BIU: Ahora debería funcionar – Kabie

7

Respuesta corta: no heredan la misma clase base directa e indirectamente, pero heredando directamente después indirectamente debería funcionar. Por lo tanto, no herede Predator ni lo herede después deLion.

Bueno, el C3 MRO parece no ser capaz de encontrar ninguna orden coherente con todas las restricciones. Las limitaciones son que:

  • cada clase debe venir antes de que sea clases base
  • y las clases base debe venir en el orden en que aparecen.

se hereda Crossbreeds, Predator y Lion en ese orden, por lo que sus métodos deben ser llamados en ese orden. Pero dado que Lion hereda Predator, sus métodos deben llamarse antes que los de Predator. Lo cual no es posible, por lo tanto, dice que no puede crear un orden de resolución de método coherente.

+0

¡Gracias! Lo entiendo. Entonces eso significa que '(Crossbreeds, Lion, Predator)' debería funcionar, ¿verdad? Eso me da otra pregunta: usando esa redacción, ¿qué debo hacer si quiero que 'Tigon' herede un método que se define de manera diferente en' Lion' y 'Predators', y quiero que' Tigon' lo tome de 'Depredadores ¿? – BIU

0

Si bien entendido el modelo de herencia que ha descrito, esto es cómo se debe definir la clase Tigon:

class Mammal(object): 
    def __init__(self): 
     super(Mammal, self).__init__() 

class Crossbreeds(Mammal): 
    def __init__(self): 
     super(Crossbreeds, self).__init__() 

class Predator(Mammal): 
    def __init__(self): 
     super(Predator, self).__init__() 

class Lion(Predator): 
    def __init__(self): 
     super(Lion, self).__init__() 

class Tigon(Lion, Crossbreeds, Predator): 
    def __init__(self): 
     super(Tigon, self).__init__() 

t = Tigon() 

esta alternativa es equivalente, desde el león es un depredador:

class Tigon(Lion, Crossbreeds): 
    def __init__(self): 
     super(Tigon, self).__init__() 

Ahora aquí hay una regla rápida para esto. El constructor de cada clase se llama después de las clases base, pero deben aparecer en el orden inverso inverso en la definición de la clase. Además, las clases que anulan los métodos definidos en su (s) clase (s) primaria (s) deben aparecer primero en las definiciones de clase; esto significa que si desea anular un método de Predator en Lion, Lion debería aparecer antes de Predator en la definición. La explicación más larga para esto está en Jan Hudec's answer.

+0

Consulte [la respuesta de Jan] (http://stackoverflow.com/questions/6057540/python-super-should-be-working-but-isnt/6057743#6057743) para obtener una descripción de por qué –

Cuestiones relacionadas