Neste tutorial, você aprenderá sobre herança múltipla em Python e como usá-la em seu programa. Você também aprenderá sobre herança de vários níveis e a ordem de resolução do método.
Herança múltipla Python
Uma classe pode ser derivada de mais de uma classe base em Python, semelhante a C ++. Isso é chamado de herança múltipla.
Na herança múltipla, os recursos de todas as classes básicas são herdados na classe derivada. A sintaxe para herança múltipla é semelhante à herança única.
Exemplo
class Base1: pass class Base2: pass class MultiDerived(Base1, Base2): pass
Aqui, a classe MultiDerived é derivada das classes Base1 e Base2.
![](https://cdn.wiki-base.com/1428282/python_multiple_inheritance_what_is_it_and_how_to_use_it_.jpg.webp)
A classe MultiDerived herda das classes Base1 e Base2.
Herança multinível do Python
Também podemos herdar de uma classe derivada. Isso é chamado de herança multinível. Pode ser de qualquer profundidade em Python.
Na herança multinível, os recursos da classe base e da classe derivada são herdados na nova classe derivada.
Um exemplo com a visualização correspondente é fornecido abaixo.
class Base: pass class Derived1(Base): pass class Derived2(Derived1): pass
Aqui, a classe Derived1 é derivada da classe Base e a classe Derived2 é derivada da classe Derived1.
![](https://cdn.wiki-base.com/1428282/python_multiple_inheritance_what_is_it_and_how_to_use_it__2.jpg.webp)
Ordem de resolução de método em Python
Cada classe em Python é derivada da object
classe. É o tipo mais básico em Python.
Portanto, tecnicamente, todas as outras classes, tanto internas quanto definidas pelo usuário, são classes derivadas e todos os objetos são instâncias da object
classe.
# Output: True print(issubclass(list,object)) # Output: True print(isinstance(5.5,object)) # Output: True print(isinstance("Hello",object))
No cenário de herança múltipla, qualquer atributo especificado é pesquisado primeiro na classe atual. Se não for encontrado, a pesquisa continua nas classes pai em profundidade, primeiro à direita, sem pesquisar a mesma classe duas vezes.
Assim, no exemplo acima de MultiDerived
classe a ordem de pesquisa é ( MultiDerived
, Base1
, Base2
, object
). Essa ordem também é chamada de linearização de MultiDerived
classe e o conjunto de regras usadas para encontrar essa ordem é chamado de Ordem de Resolução de Método (MRO) .
O MRO deve evitar a ordem de precedência local e também fornecer monotonicidade. Isso garante que uma classe sempre apareça antes de seus pais. No caso de pais múltiplos, a ordem é a mesma das tuplas das classes base.
O MRO de uma classe pode ser visto como o __mro__
atributo ou o mro()
método. O primeiro retorna uma tupla, enquanto o último retorna uma lista.
>>> MultiDerived.__mro__ (, , , ) >>> MultiDerived.mro() (, , , )
Aqui está um exemplo de herança múltipla um pouco mais complexo e sua visualização junto com o MRO.
![](https://cdn.wiki-base.com/1428282/python_multiple_inheritance_what_is_it_and_how_to_use_it__3.jpg.webp)
# Demonstration of 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 # Output: # (, , # , , # , , # ) print(M.mro())
Resultado
(,,,,,,)
Para saber o algoritmo real sobre como o MRO é calculado, visite Discussão sobre MRO.