Herencia múltiple en Python

Ishaan Shrivastava 21 marzo 2022
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.

Artículo relacionado - Python Class