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.

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):
    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 built-in object.

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

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