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.
GO TO FULL VERSION