Dominando Herança Múltipla, Herança Multinível e Method Resolution Order (MRO) em Python
Herança Múltipla em Python
Explore como Python suporta herança múltipla, nuances da herança multinível e como a ordem de resolução de métodos (MRO) governa lookup de atributos.
Herança Múltipla em Python
Python permite classe herdar de mais de uma classe base, assim como C++. Esse recurso é conhecido como herança múltipla e permite classe derivada combinar comportamento de várias classes pai.
A sintaxe espelha herança simples: liste todas classes pai entre parênteses, separadas por vírgula.
Exemplo
class Base1:
pass
class Base2:
pass
class MultiDerived(Base1, Base2):
pass
Neste exemplo, MultiDerived herda atributos e métodos de ambos Base1 e Base2.

Diagrama: MultiDerived recebe features de Base1 e Base2.
Herança Multinível em Python
Além de dois níveis, você pode encadear herança: classe herda de classe derivada, criando hierarquia de herança multinível. Python suporta qualquer profundidade.
Cada nova classe derivada herda de seu pai imediato, enquanto também carrega atributos dos ancestrais.
Exemplo:
class Base:
pass
class Derived1(Base):
pass
class Derived2(Derived1):
pass
Aqui, Derived1 estende Base, e Derived2 estende Derived1, formando cadeia de três níveis.

Method Resolution Order (MRO) em Python
Toda classe Python herda ultimamente de object, tipo base universal. Consequentemente, todos objetos são instâncias de object, sejam built-in ou user-defined:
# Saída: True
print(issubclass(list,object))
# Saída: True
print(isinstance(5.5,object))
# Saída: True
print(isinstance("Hello",object))
Quando herança múltipla envolvida, Python resolve atributos usando travessia depth-first, left-to-right, sem revisitar classe duas vezes. Essa ordem de travessia é chamada Method Resolution Order (MRO) e garante que classe apareça antes de seus pais.
O MRO para MultiDerived é: [MultiDerived, Base1, Base2, object]. Você pode visualizá-lo via atributo __mro__ ou método mro():
MultiDerived.__mro__
# (<class '__main__.MultiDerived'>, <class '__main__.Base1'>, <class '__main__.Base2'>, <class 'object'>)
MultiDerived.mro()
# [<class '__main__.MultiDerived'>, <class '__main__.Base1'>, <class '__main__.Base2'>, <class 'object'>]
Grafos de herança complexos seguem mesmo princípio. Considere este exemplo:

# Demonstração de MRO
class X: pass
class Y: pass
class Z: pass
class A(X, Y): pass
class B(Y, Z): pass
class M(B, A, Z): pass
print(M.mro())
# Saída:
# [<class '__main__.M'>, <class '__main__.B'>, <class '__main__.A'>, <class '__main__.X'>, <class '__main__.Y'>, <class '__main__.Z'>, <class 'object'>]
Para aprofundar no algoritmo que calcula MRO, consulte documentação oficial Python sobre herança de classes e discussão sobre MRO.
python
- Dominando Tipos de Dados em Python: Guia Prático
- Dominando Operadores em Python: Guia Completo
- Dominando a Declaração Pass em Python: Guia Prático
- Dominando Dicionários em Python: Criação, Manipulação e Técnicas Avançadas
- Dominando Exceções Customizadas em Python: Guia Prático
- Dominando Programação Orientada a Objetos em Python: Classes, Herança, Encapsulamento e Polimorfismo
- Dominando Herança em Python: Conceitos, Sintaxe e Exemplos Práticos
- Entendendo type() e isinstance() em Python: Exemplos Práticos
- Dominando Herança em C#: Construa Código Reutilizável e Manutenível
- Programação Orientada a Objetos em Python: Guia Completo