English | 简体中文 | 繁體中文 | Русский язык | Français | Español | Português | Deutsch | 日本語 | 한국어 | Italiano | بالعربية
Neste artigo, você aprenderá o que é a herança múltipla no Python e como usá-la em programas. Você também aprenderá sobre herança multi-nível e a ordem de resolução de métodos.
C ++comoClassePode derivar de várias classes base no Python. Isso se chama herança múltipla.
Na herança múltipla, todas as funções das classes base são herdadas para a subclass. A sintaxe da herança múltipla é semelhante a uma herança únicaHerança.
class Base1: pass class Base2: pass class MultiDerived(Base1, Base2) pass
Aqui,MultiDerivedclasse derivadaBase1eBase2.
A classe MultiDerived deriva de Base1e Base2Herança.
Por outro lado, também podemos herdar subclasses. Isso se chama herança multi-nível. No Python, pode ser de qualquer profundidade.
Na herança multi-nível, as funções da classe base e da subclass são herdadas para a nova subclass.
A seguir, é fornecido um exemplo com efeito visual correspondente.
class Base: pass class Derived1(Base): pass class Derived2(Derived1) pass
Aqui,Derived1deBasederivação,Derived2deDerived1Derivação.
Cada classe em Python deriva dessa classe object. É o tipo mais básico do Python.
Portanto, tecnicamente, todas as outras classes (pré-definidas ou definidas pelo usuário) são subclasses, e todos os objetos são exemplos da classe object.
# Saída: True print(issubclass(list, object)) # Saída: True print(isinstance(5.5,object)) # Saída: True print(isinstance("Hello", object))
No esquema de múltipla herança, qualquer atributo especificado será pesquisado primeiro no classe atual. Se não for encontrado, a busca continuará de forma profunda e prioritária, de esquerda para direita, dentro da classe pai, sem a necessidade de procurar a mesma classe duas vezes.
Portanto, no exemplo acima, a ordem de busca da classe MultiDerived é [MultiDerived, Base1,Base2,object]。Esta ordem também é chamada de linearização da classe MultiDerived, e as regras para encontrar essa ordem são conhecidas como “ Ordem de resolução de métodos (MRO).
O MRO deve evitar a prioridade local da ordenação e também deve fornecer monotonia. Isso garante que uma classe sempre apareça antes de seus pais, e se houver múltiplos pais, a ordem é a mesma que a tupla das classes base.
Pode-se considerar o MRO da classe como a propriedade __mro__ ou o método mro(). A primeira retorna um tupla, enquanto a segunda 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'>]
Este é um exemplo de herança múltipla um pouco mais complexa, bem como sua visualização e 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 # Sai: # [<class '__main__.M'>, <class '__main__.B'>, # <class '__main__.A'>, <class '__main__.X'>, # <class '__main__.Y'>, <class '__main__.Z'>, # <class 'object'>] print(M.mro())
Por favor, consulte este conteúdo para obter mais informações.Discutir MRO,e compreenda a forma de cálculo da algoritmos reais.