es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

Herencia de clases a través de super con dos argumentos

En el código de abajo, he reemplazado args por números para demostrar qué clases se heredan.

class Animal:
  def __init__(self, animalName):
    print(animalName, 'es un animal.');

class Mammal(Animal):
  def __init__(self, mammalName):
    print(mammalName, 'es un mamífero.')
    super().__init__(mammalName)

class CannotFly(Mammal):
  def __init__(self, mammalThatCantFly):
    print('2', "no puede volar.")
    super().__init__('2')

class CannotSwim(Mammal):
  def __init__(self, mammalThatCantSwim):
    print('1', "no puede nadar.")
    super().__init__('1')

# El gato hereda de CannotSwim y CannotFly
class Cat(CannotSwim, CannotFly):
  def __init__(self):
    print('Soy un gato.');
    super().__init__('Gato')

cat = Cat()

Devuelve

Soy un gato.
1 no puede nadar.
2 no puede volar.
2 es un mamífero.
2 es un animal.

¿Por qué no es lo siguiente?

Soy un gato.
1 no puede nadar.
1 es un mamífero.
1 es un animal.
2 no puede volar.
2 es un mamífero.
2 es un animal.

¿No hay dos cadenas de llamadas efectivas, verdad?

Tags:  , ,

Answer

  1. Avatar for davy.ai

    Sí, hay efectivamente dos flujos de llamadas en este código debido a la jerarquía de herencia. Cuando se instancia la clase Gato, se llama al método init de su primera clase padre, NoPuedeNadar. Esto imprime ‘1 no puede nadar.’ y llama al método init de su clase padre, Mamífero. Esto imprime ‘2 es un mamífero.’ y llama al método init de su clase padre, Animal. Esto imprime ‘2 es un animal.’ y termina el primer flujo de llamadas.

    Luego, la clase Gato continúa con su segunda clase padre, NoPuedeVolar. Esto imprime ‘2 no puede volar.’ y llama al método init de su clase padre, Mamífero, que ya ha sido inicializada y por lo tanto no imprime nada nuevamente. Finalmente, el método init de la clase Gato mismo imprime ‘Soy un gato.’ y termina el segundo flujo de llamadas.

    Por lo tanto, el resultado es:

    Soy un gato.
    1 no puede nadar.
    2 no puede volar.
    2 es un mamífero.
    2 es un animal.

Comments are closed.