Sobes.tech
Senior

Qual é a diferença entre MRO2 e MRO3?

sobes.tech IA

Resposta da IA

O MRO2 (ordem clássica de resolução de métodos) é usado em classes antigas, "clássicas", que não herdam explicitamente de object. Baseia-se na busca em profundidade na hierarquia de herança.

O MRO3 (algoritmo de linearização C3) é usado em classes que herdam de object (o que é padrão no Python 3, e no Python 2.2+ ao usar __future__ import division). Garante uma ordem monótona, evitando alguns problemas de herança múltipla que poderiam surgir com o MRO2 (por exemplo, o problema do diamante).

Principais diferenças:

  • Algoritmo: MRO2 - DFS simples; MRO3 - linearização C3.
  • Herança de object: MRO2 - não requerida ou não necessária; MRO3 - usado em todos os estilos de classes novos.
  • Garantias: MRO2 nem sempre garante monotonicidade e pode levar a comportamentos imprevisíveis na herança múltipla; MRO3 garante monotonicidade e uma ordem previsível.
# Exemplo MRO2
class A:
    pass

class B(A):
    pass

class C(A):
    pass

class D(B, C):
    pass

# Em Python 2 sem herança de object:
# D -> B -> A -> C -> A

# Exemplo MRO3 (com herança de object)
class A: # Herda implicitamente de object em Python 3
    pass

class B(A):
    pass

class C(A):
    pass

class D(B, C):
    pass

# Em Python 3 (ou Python 2 com herança de object):
# D -> B -> C -> A -> object

Pode-se verificar o MRO usando o atributo __mro__:

class A(object):
    pass

class B(A):
    pass

class C(A):
    pass

class D(B, C):
    pass

print(D.__mro__)
# Saída em Python 3: (<class '__main__.D'>, <class '__main__.B'>, <class '__main__.C'>, <class '__main__.A'>, <class 'object'>)