Entenda a Ordem de Resolução de Métodos (MRO)
Nesta etapa, você aprenderá sobre a Ordem de Resolução de Métodos (MRO) em Python. MRO é a ordem na qual o Python procura um método em uma hierarquia de classes. É particularmente importante ao lidar com herança múltipla.
Vamos criar um novo conjunto de classes para ilustrar o MRO. Crie um arquivo chamado animal.py no seu diretório ~/project usando o editor VS Code:
class Animal:
def __init__(self, name):
self.name = name
def speak(self):
return "Generic animal sound"
class Mammal(Animal):
def speak(self):
return "Generic mammal sound"
class Dog(Mammal):
def speak(self):
return "Woof!"
class Cat(Mammal):
def speak(self):
return "Meow!"
Salve o arquivo animal.py.
Agora, vamos criar um novo arquivo chamado mro_example.py no diretório ~/project para demonstrar o MRO:
from animal import Animal, Mammal, Dog, Cat
my_dog = Dog("Buddy")
my_cat = Cat("Whiskers")
print(my_dog.speak())
print(my_cat.speak())
Salve o arquivo mro_example.py.
Neste exemplo:
Animal é a classe base com um método speak.
Mammal herda de Animal e sobrescreve o método speak.
Dog herda de Mammal e sobrescreve o método speak.
Cat herda de Mammal e sobrescreve o método speak.
Quando você chama my_dog.speak(), o Python primeiro procura o método speak na classe Dog. Se não o encontrar lá, ele procura na classe Mammal e, em seguida, na classe Animal. Essa ordem é determinada pelo MRO.
Para executar o script mro_example.py, abra seu terminal e navegue até o diretório ~/project:
cd ~/project
Em seguida, execute o script usando o comando python:
python mro_example.py
Você deve ver a seguinte saída:
Woof!
Meow!
Agora, vamos explorar um exemplo mais complexo com herança múltipla. Crie um novo arquivo chamado mro_complex.py no diretório ~/project:
class A:
def method(self):
return "A"
class B(A):
def method(self):
return "B"
class C(A):
def method(self):
return "C"
class D(B, C):
pass
d = D()
print(d.method())
print(D.mro())
Salve o arquivo mro_complex.py.
Neste exemplo:
- A classe
D herda de B e C.
- Tanto
B quanto C herdam de A.
- O
method é definido em todas as três classes A, B e C.
Para executar o script mro_complex.py, abra seu terminal e navegue até o diretório ~/project:
cd ~/project
Em seguida, execute o script usando o comando python:
python mro_complex.py
Você deve ver a seguinte saída:
B
[<class '__main__.D'>, <class '__main__.B'>, <class '__main__.C'>, <class '__main__.A'>, <class 'object'>]
A saída B indica que o method da classe B é chamado. O método D.mro() retorna uma tupla representando a ordem de resolução de métodos para a classe D. Neste caso, o MRO é D -> B -> C -> A -> object. Isso significa que, quando você chama d.method(), o Python primeiro procura o método na classe D, depois na classe B, depois na classe C, depois na classe A e, finalmente, na classe base object.
Compreender o MRO é essencial para prever o comportamento do seu código ao usar herança, especialmente herança múltipla.