1
resposta

PYTHON Multiple Inheritance: Como herdar o __init__() de duas classes-mães?

Removido a pedido do usuario.
1 resposta

Ei Abner! Como vai?

Imagine o seguinte caso:

class A:
    def __init__(self):
        print("Classe A")


class B:
    def __init__(self):
        print("Classe B")


class C(A, B):
    def __init__(self):
        print("Classe C")

De posse disto, irei lhe apresentar duas formas de invocar os inicializadores das classes mães.

A primeira forma é os chamando explicitamente. Desta forma:

class C(A, B):
    def __init__(self):
        print("Classe C")
        A.__init__(self)
        B.__init__(self)

Resultado:

Classe C
Classe A
Classe B

A segunda forma é projetando as classes mães para lidar com a herança múltipla, fazendo com que elas também invoquem o __init__:

class A:
    def __init__(self):
        print("Classe A")
        super().__init__()


class B:
    def __init__(self):
        print("Classe B")
        super().__init__()

Depois disto, você precisaria apenas invocar um super.init() na classe C:

super().__init__()

Resultado:

Classe C
Classe A
Classe B

Esta é a parte prática do que você quer fazer. A parte teórica por trás disto diz respeito a como a herança múltipla irá se comportar, pois quando temos esta abordagem é interessante que haja um trabalho cooperativo entre as classes, por isto que desta segunda maneira apresentada há um super() em cada classe, para que ocorra uma chamada em cadeia.

Caso você não saiba se as classes foram projetadas para trabalhar com herança múltipla o primeiro exemplo onde chamamos diretamente o init de cada classe é o recomendado.

Lembrando que herança múltipla pode levar seu código a uma complexidade maior que o desejado, por isso, prefira o uso de composição à herança.

Qualquer dúvida é só falar. Espero ter ajudado. Abraços e bons estudos!