Herança múltipla do Python
Herança múltipla do Python
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 multinível e a ordem de resolução de métodos.
Herança múltipla do 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 base 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, o MultiDerivado classe é derivada de Base1 e Base2 Aulas.
O Multiderivado classe herda de ambos Base1 e Base2 Aulas.
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 visualização correspondente é dado abaixo.
class Base:
pass
class Derived1(Base):
pass
class Derived2(Derived1):
pass
Aqui, o Derivado1 classe é derivada da Base classe e o Derivado2 classe é derivada de Derived1 classe.
Ordem de resolução de métodos em Python
Cada classe em Python é derivada do
object
classe. É o tipo mais básico em Python. Então, tecnicamente, todas as outras classes, incorporadas ou definidas pelo usuário, são classes derivadas e todos os objetos são instâncias do
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 da esquerda para a direita, sem pesquisar a mesma classe duas vezes.
Então, no exemplo acima de
MultiDerived
class a ordem de pesquisa é [MultiDerived
, Base1
, Base2
, object
]. Essa ordem também é chamada de linearização de MultiDerived
class e o conjunto de regras usado para encontrar esse pedido é chamado de Method Resolution Order (MRO) . O MRO deve evitar a ordenação de precedência local e também fornecer monotonicidade. Ele garante que uma classe sempre apareça antes de seus pais. No caso de vários pais, 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__
(<class '__main__.MultiDerived'>,
<class '__main__.Base1'>,
<class '__main__.Base2'>,
<class 'object'>)
>>> MultiDerived.mro()
[<class '__main__.MultiDerived'>,
<class '__main__.Base1'>,
<class '__main__.Base2'>,
<class 'object'>]
Aqui está um exemplo de herança múltipla um pouco mais complexo e sua visualização junto com o MRO.
# 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:
# [<class '__main__.M'>, <class '__main__.B'>,
# <class '__main__.A'>, <class '__main__.X'>,
# <class '__main__.Y'>, <class '__main__.Z'>,
# <class 'object'>]
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 conhecer o algoritmo real sobre como o MRO é calculado, visite Discussão sobre MRO.
python