Ordem de Resolução de Métodos
Parte da seção Object Oriented Programming do Journey de Python da Coddy — lição 21 de 64.
Method Resolution Order (MRO) é a sequência que o Python usa para procurar métodos quando várias classes possuem o mesmo nome de método.
Aqui está um exemplo com múltiplas classes tendo o mesmo método:
class A:
def method(self):
return "Method from A"
class B:
def method(self):
return "Method from B"
class C(A, B):
passVerifique o MRO usando __mro__:
print(C.__mro__)Saída:
(<class '__main__.C'>, <class '__main__.A'>, <class '__main__.B'>, <class 'object'>)O atributo __mro__ é uma tupla que contém todas as classes na ordem de resolução. O primeiro elemento (__mro__[0]) é sempre a própria classe (C), seguida pelas classes pai da esquerda para a direita (A, depois B) e, finalmente, a classe built-in object.
Crie um objeto e chame o método:
c = C()
print(c.method())Saída:
Method from AO Python encontrou o método na classe A primeiro (no índice 1 no MRO), então ele usou esse.
Altere a ordem de inheritance para ver a diferença:
class D(B, A): # B vem antes de A agora
pass
print(D.__mro__)
d = D()
print(d.method())Output:
(<class '__main__.D'>, <class '__main__.B'>, <class '__main__.A'>, <class 'object'>)
Method from BAgora o Python encontra o método de B primeiro porque B vem antes de A na lista de herança. Você pode acessar classes específicas na MRO usando indexação - D.__mro__[0] é D em si, D.__mro__[1] é B, e D.__mro__[2] é A.
Você também pode usar o método mro():
print(C.mro())Embora mro() e __mro__ forneçam a mesma sequência de classes, eles diferem no tipo: __mro__ retorna uma tupla, enquanto mro() retorna uma lista.
Ponto-chave: O Python busca por métodos na ordem de MRO - a própria classe primeiro (índice 0), e depois as classes pai da esquerda para a direita, conforme listadas na definição da classe (índices 1, 2, etc.). O primeiro método encontrado é utilizado.
Desafio
MédioNeste desafio, você implementará uma hierarquia de classes.
Você precisará editar estes arquivos:
device.py: Implemente a classe baseDevicescreen.py: Implemente a classeScreenque herda deDevicecomputer.py: Implemente a classeComputerque herda deDevicelaptop.py: Implemente a classeLaptopcom herança múltipladriver.py- Implemente casos de teste que verificarão se sua implementação funciona corretamente
Cada arquivo contém comentários TODO detalhados que guiarão você passo a passo através da implementação.
Experimente você mesmo
# TODO: Importe todas as classes necessárias
# from device import Device
# from screen import Screen
# from computer import Computer
# from laptop import Laptop
def explain_mro(class_name):
# TODO: Imprima o MRO (Method Resolution Order) da classe fornecida
# TODO: Formato: "MRO for [class name]:" (nota: SEM espaço após os dois pontos)
# TODO: Use class_name.__name__ para obter o nome da classe
# TODO: Use class_name.__mro__ para obter a tupla MRO
# TODO: Imprima cada nome de classe no MRO em linhas separadas
# TODO: Crie uma instância da classe
# TODO: Chame power_on() na instância e armazene o resultado
# TODO: Print: "Power on result: [result]"
# TODO: Imprima uma linha vazia para melhor legibilidade
pass
# Teste seu código
# TODO: Chame explain_mro() com cada classe: Device, Screen, Computer e Laptop
Esta lição inclui um quiz rápido. Comece a lição para respondê-lo e acompanhar seu progresso.
Todas as lições de Object Oriented Programming
1Fundamentos de POO
Arquivos ExternosIntrodução à POOClasses vs ObjetosO Parâmetro selfMétodosAtributosMétodo Construtor (__init__)Recapitulação - Calculadora Simples4Herança
Herança BásicaA Função super()Sobrescrita de MétodoHerança MúltiplaOrdem de Resolução de MétodosRecapitulação - Hierarquia de Funcionários7Métodos Especiais
Introdução aos Métodos MágicosSobrecarga de OperadoresMétodos Mágicos de ContêinerRecapitulação - Lista Personalizada10Padrões de Projeto Parte 1
Introdução a Padrões de ProjetoPadrão SingletonPadrão FactoryPadrão ObserverPadrão Strategy2Decoradores
Introdução aos DecoradoresDecorador de PropriedadeDecorador de Método EstáticoDecorador de Método de Classe5Polimorfismo
Sobrescrita de Método RevisitadaDuck TypingClasses e Métodos AbstratosDesign de InterfacesRecapitulação - Calculadora de Formas8Conceitos Avançados de POO
Composição vs HerançaMixinsMétodos Estáticos e de ClasseDecoradores de ClasseGerenciadores de Contexto11Padrões de Projeto Parte 2
Padrão CommandPadrão AdapterPadrão DecoratorPadrão Template MethodPadrão StatePadrão Composite3Propriedades de Classe
Variáveis de Instância vs de ClasseDecoradores de PropriedadeAtributos PrivadosRecapitulação - Gerenciador de Conta Bancária6Encapsulamento
Membros Públicos, Protegidos e PrivadosModificadores de AcessoOcultação de InformaçãoProperty Decorators AvançadosRecapitulação - Sistema de Registro de Alunos12Projeto: Gerenciamento de Biblioteca
Visão Geral do ProjetoClasses Livro e UsuárioSistema de EmpréstimosFuncionalidade de BuscaInterface AdministrativaTestes e Integração