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.
A Ordem de Resolução de Métodos (MRO - Method Resolution Order) é a sequência que o Python utiliza para procurar por métodos quando múltiplas 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 de objeto integrada.
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 o utilizou.
Altere a ordem de herança para ver a diferença:
class D(B, A): # B vem antes de A agora
pass
print(D.__mro__)
d = D()
print(d.method())Saída:
(<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 no MRO usando indexação - D.__mro__[0] é o próprio D, D.__mro__[1] é B, e D.__mro__[2] é A.
Você também pode usar o método mro():
print(C.mro())Isso fornece o mesmo resultado que __mro__, mas como uma lista.
Ponto Chave: O Python procura por métodos na ordem MRO - a própria classe primeiro (índice 0), depois as classes pai da esquerda para a direita conforme listado 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 o guiarão passo a passo pela implementação.
Folha de consulta
Method Resolution Order (MRO) é a sequência que o Python utiliza para procurar métodos quando múltiplas classes possuem o mesmo nome de método.
Verifique a MRO usando __mro__ ou mro():
class A:
def method(self):
return "Method from A"
class B:
def method(self):
return "Method from B"
class C(A, B):
pass
print(C.__mro__)
print(C.mro()) # Mesmo resultado como uma listaO Python procura por métodos na ordem da MRO - primeiro a própria classe, depois as classes pai da esquerda para a direita, conforme listado na definição da classe:
c = C()
print(c.method()) # "Method from A" - A vem antes de B
class D(B, A): # B vem antes de A agora
pass
d = D()
print(d.method()) # "Method from B" - B vem antes de AExperimente você mesmo
# TODO: Importar 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: Imprimir a MRO (Method Resolution Order) para a classe fornecida
# TODO: Formato: "MRO for [class name]:" (nota: SEM espaço após os dois pontos)
# TODO: Usar class_name.__name__ para obter o nome da classe
# TODO: Usar class_name.__mro__ para obter a tupla MRO
# TODO: Imprimir cada nome de classe na MRO em linhas separadas
# TODO: Criar uma instância da classe
# TODO: Chamar power_on() na instância e armazenar o resultado
# TODO: Imprimir: "Power on result: [result]"
# TODO: Imprimir uma linha vazia para melhor legibilidade
pass
# Teste seu código
# TODO: Chamar 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ário