Menu
Coddy logo textTech

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):
    pass

Verifique 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 A

O 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 B

Agora 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.

challenge icon

Desafio

Médio

Neste desafio, você implementará uma hierarquia de classes.

Você precisará editar estes arquivos:

  • device.py: Implemente a classe base Device
  • screen.py: Implemente a classe Screen que herda de Device
  • computer.py: Implemente a classe Computer que herda de Device
  • laptop.py: Implemente a classe Laptop com herança múltipla
  • driver.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 lista

O 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 A

Experimente 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
quiz iconTeste seus conhecimentos

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