CodeGym /Cursos /Python SELF PT /Herança múltipla

Herança múltipla

Python SELF PT
Nível 16 , Lição 4
Disponível

10.1 Herança de várias classes

Herança múltipla em Python permite que uma classe herde atributos e métodos de mais de uma classe pai. Isso dá maior flexibilidade e permite reutilizar o código, mas também pode levar a hierarquias complicadas e potenciais conflitos.

Possibilitar que sua classe tenha cinco pais amplia suas oportunidades e torna a escrita do código muito conveniente. Fazer isso é muito fácil — basta listar as classes pai separadas por vírgula:


class Base1:
    def method1(self):
        print("Method1 from Base1")
        
class Base2:
    def method2(self):
        print("Method2 from Base2")
        
class Derived(Base1, Base2):
    pass
        
obj = Derived()
obj.method1()
obj.method2()     
        

Tudo funciona como planejado — lindo.

Porém, a herança múltipla tem alguns lados complexos que é essencial considerar ao usá-la. Vamos ver como isso funciona e como evitar problemas relacionados à herança múltipla.

10.2 Chamando um método que existe em várias classes base

Uma classe pode herdar atributos e métodos de várias classes pai listadas entre parênteses após o nome da classe. E esses atributos e métodos podem ter os mesmos nomes:


class Base1:
    def method(self):
        print("Method from Base1")
        
class Base2:
    def method(self):
        print("Method from Base2")
        
class Derived(Base1, Base2):
    pass
        

obj = Derived()
obj.method() # qual método será chamado aqui?
        

Neste exemplo, a classe Derived herda de Base1 e Base2. Quando method() é chamado, o Python escolherá o método da primeira classe listada — Base1.

Mas isso não é tão óbvio, né? E se alguém mudar o código da classe base, toda a lógica do aplicativo pode ser afetada, e você nem saberá que algo está errado. Simplesmente começarão a ser chamados métodos ligeiramente errados :)

10.3 Usando super() com herança múltipla

Outra coisa interessante é a chamada de super() para a classe base com herança múltipla.

Exemplo:


class Base1:
    def method(self):
        print("Method from Base1")
        super().method()
        
class Base2:
    def method(self):
        print("Method from Base2")
        super().method()
        
class Derived(Base1, Base2):
    def method(self):
        print("Method from Derived")
        super().method()
         

obj = Derived()
obj.method()
        

E aí? Qual será a saída na tela?

Method from Derived
Method from Base1

Ou

Method from Derived
Method from Base2 

Tenho uma surpresa pra você — a saída será assim:

Method from Derived
Method from Base1
Method from Base2

O código super().method() vai chamar o método method() de cada classe base! Esses são exatamente os detalhes que mencionei ao falar pela primeira vez sobre herança múltipla.

10.4 Herança em losango (Diamond)

E finalmente, o problema clássico da herança em losango. É mais fácil mostrar com um exemplo do que descrever:

Em termos de código, isso pode parecer assim:


class A:
    def method(self):
        print("Method from A")
        
class B(A):
    def method(self):
        print("Method from B")
        super().method()
        
class C(A):
    def method(self):
        print("Method from C")
        super().method()
        
class D(B, C):
    def method(self):
        print("Method from D")
        super().method()
         
         
        
obj = D()
obj.method()
        

A saída será assim:

Method from D
Method from B
Method from C
Method from A 

Para se orientar um pouco na herança múltipla, você precisa saber bem em que ordem o Python procura campos e métodos nas classes pai. Justamente sobre isso você saberá na próxima palestra.

Comentários
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION