Herança múltipla em Python

Ishaan Shrivastava 18 julho 2021
Herança múltipla em Python

A herança nos permite usar recursos da classe pai em uma classe filha e é um recurso essencial da programação orientada a objetos. Ajuda com a reutilização e transitividade dos dados da classe pai para a classe filha e compensa a perda de dados.

Herança múltipla é quando a classe filha herda os métodos e recursos de duas ou mais classes pai. É benéfico derivar todos os dados de uma vez. Ainda assim, por outro lado, ele vem com complexidade e ambigüidade de uso. É ambíguo dizer qual característica é de qual pai, se vários pais possuem a mesma característica. Ocorre quando a herança múltipla não é usada ou implementada corretamente. A herança virtual, o uso de Method Resolution Order (MRO) e a função super() podem de alguma forma reduzir seus riscos.

Vemos um exemplo básico de várias heranças no código a seguir.

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()

Resultado:

Father drives his son to school
Mother loves to cook for her son
I love my parents

A classe filha Son é derivada das classes pai Father e Mother, o que permite usar as funções drive() e cook() para fornecer a saída desejada.

A função super() refere-se à classe pai ou irmã na classe filha herdada e retorna um objeto temporário que permite à classe filha usar todos os métodos da superclasse.

Isso geralmente é feito em caso de ambigüidade, quando a herança começa a se cruzar, ou seja, quando as duas classes pai também são derivadas da superclasse de base.

Por exemplo,

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")

Resultado:

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.

Uma classe filha Cat é criada, herdada pelas classes de dois pais donotswim e donotfly. Então, a classe Mammals os herda. Além disso, a classe Mammals herda as propriedades da superclasse Animals. Portanto, neste caso, usamos a função super() para acessar facilmente os métodos da superclasse.

Artigo relacionado - Python Class