English | 简体中文 | 繁體中文 | Русский язык | Français | Español | Português | Deutsch | 日本語 | 한국어 | Italiano | بالعربية

Tutorial Básico do Python

Controle de Fluxo do Python

Função do Python

Tipos de Dados do Python

Operação de Arquivos do Python

Objetos e Classes do Python

Data e Hora do Python

Conhecimento Avançado do Python

Manual de Referência do Python

Herança Múltipla do Python

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.

Herança múltipla no Python

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.

Exemplo

class Base1:
    pass
class Base2:
    pass
class MultiDerived(Base1, Base2)
    pass

Aqui,MultiDerivedclasse derivadaBase1eBase2.

A classe MultiDerived deriva de Base1e Base2Herança.

Herança multi-nível no Python

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.

Ordem de resolução de métodos no Python

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.