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?
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.