Herencia múltiple en Python
La herencia nos permite usar las características de la clase principal en una clase secundaria y es una característica esencial de la programación orientada a objetos. Ayuda con la reutilización y la transitividad de los datos de la clase principal a la clase secundaria y compensa la pérdida de datos.
La herencia múltiple es cuando la clase secundaria hereda los métodos y características de dos o más clases principales. Es beneficioso obtener todos los datos a la vez. Aún así, por otro lado, viene con complejidad y ambigüedad de uso. Es ambiguo decir qué característica es de qué padre si varios padres poseen la misma característica. Ocurre cuando la herencia múltiple no se usa o no se implementa correctamente. La herencia virtual, el uso de Method Resolution Order (MRO) y la función super()
pueden reducir de alguna manera sus riesgos.
Vemos un ejemplo básico de herencias múltiples en el siguiente código.
class Father:
def drive(self):
print("Father drives his son to school")
class Mother:
def cook(self):
print("Mother loves to cook for her son")
class Son(Father, Mother):
def love(self):
print("I love my Parents")
c = Son()
c.drive()
c.cook()
c.love()
Producción :
Father drives his son to school
Mother loves to cook for her son
I love my parents
La clase secundaria Son
se deriva de las clases padre Father
y Mother
, lo que le permite utilizar las funciones drive()
y cook()
para dar el resultado deseado.
La función super()
se refiere a la clase principal o hermana en la clase secundaria heredada y devuelve un objeto temporal que permite que la clase secundaria utilice todos los métodos de la superclase.
Esto generalmente se hace en caso de ambigüedad cuando la herencia comienza a cruzarse, es decir, cuando las dos clases principales también se derivan de la clase superbase.
Por ejemplo,
class Animals:
def __init__(self, animalsName):
print(animalsName, "is an animal.")
class Mammal(Animals):
def __init__(self, Name):
print(Name, "is a mammal.")
super().__init__(Name)
class donotFly(Mammal):
def __init__(self, name):
print(name, "cannot fly.")
super().__init__(name)
class donotSwim(Mammal):
def __init__(self, name):
print(name, "cannot swim.")
super().__init__(name)
class Cat(donotSwim, donotFly):
def __init__(self):
print("A cat.")
super().__init__("Cat")
cat = Cat()
print("")
bat = donotSwim("Bat")
Producción :
A cat.
Cat cannot swim.
Cat cannot fly.
Cat is a mammal.
Cat is an animal.
Bat cannot swim.
Bat is a mammal.
Bat is an animal.
Se crea una clase secundaria Cat
, heredada por las clases biparentales donotswim
y donotfly
. Entonces, la clase Mammals los hereda ellos mismos. Además, la clase Mammals
hereda las propiedades de la superclase Animals
. Por lo tanto, en este caso, usamos la función super()
para acceder fácilmente a los métodos de la superclase.