Vamos falar sobre algo que parece bastante complicado.
É denominado m r o ou Ordem de resolução de método.
O que isso significa?
Teremos um exemplo aqui para você.
Digamos que temos uma classe A, a classe B que herda da classe A não faz absolutamente nada.
E então também temos classi que herda novamente de A e finalmente uma classe D, então herda de
B e C.
Portanto, temos duas classes que não fazem absolutamente nada, e uma classe e classes que têm o mesmo
atributo de objeto de classe.
E eu realmente desenhei como esse relacionamento se parece.
Você vê que D tem herança múltipla de B e C e B e C herdam de A.
E estou errado ou a ordem de resolução do método é uma regra que o Python segue para determinar quando você executa um método
que deseja executar, quando você tem uma estrutura de herança tão complicada e Maroš é uma regra que
diz, ei, faça isso, faça isso e então faça isso.
E esse é o método que você deve executar.
Deixe-me mostrar o que quero dizer.
Digamos que eu queira imprimir d ponto num.
O que você acha que vai acontecer aqui?
Deixe-me tirar isso do caminho ou comentar.
Se eu executar isso, você consegue adivinhar o que vai acontecer?
Se eu clicar, corra.
Eu pego um.
É isso que você esperava?
Vamos dar uma olhada, D herda de B e C.
E então aqueles herdam de mim, então temos um, porque a medula, a ordem de resolução do método é que
não vai D, B, A, em vez disso vai D, b, c, a.
Hmmm, vamos pensar um pouco mais sobre isso, MRO é simplesmente dizer o que é o primeiro da
fila se as coisas são comuns entre classes, métodos ou variáveis ou atributos, o que devo escolher?
E, na verdade, há uma boa maneira de verificarmos isso se eu fizer o MRO e depois executá-lo assim.
Ron.
Olha só, esse é o pedido ou o MRO dessa classe, diz, ei, vou verificar primeiro se
você ligar, digamos ponto net ou ponto.
Não, vou verificar o ponto principal primeiro.
Vou verificar esta classe.
Então vou verificar o Main Dot be.
Vou verificar B e depois verificarei C.
E então vou verificar a.
E, finalmente, vou verificar o objeto da classe base novamente.
Já vimos isso antes.
É a classe base da qual todos os objetos em Python herdam.
Então essa é a ordem que ele verifica?
Não.
Se passarmos por todos esses.
E eu clico em correr.
Vou buscar outro.
D não tem atributo, não, porque passou por todo esse caminho, até checou o objeto base e nunca
encontrou nenhum.
Se eu fizesse algo como s t r.
Se eu clicar, corra.
Isso funciona porque percorre todo o caminho através da cadeia de herança e, em seguida, chega ao objeto base e
o objeto base realmente tem isso para que não sofra erosão.
E sim, você pode usar a corda Dundar.
Bem, encontrei um ótimo exemplo aqui para mostrar por que as heranças podem ser confusas e por
que coisas como MRO você pode querer evitar ou pelo menos estar ciente.
Então, vamos copiar este código.
E vamos apenas remover tudo isso.
E vamos jogar um joguinho.
Agora, esta sintaxe.
Se parece com isso, então este é o modelo de herança do que acabamos de criar parece muito confuso, não é?
Portanto, se os fizermos aqui.
E verificamos o MRO ou a ordem de resolução do método de um.
Qual você acha que a ordem vai pausar o vídeo aqui e tentar adivinhar qual será a ordem?
Redi.
Vamos lá, Dot Amaro.
E por falar nisso, outra forma de fazer isso é usar o Dundar Amaro e vamos imprimir isso.
Tudo bem, vamos verificar isso.
Portanto, a primeira coisa que temos é M. Tudo bem, verificamos ele e depois verificamos B, verificamos B, tudo bem.
E então verificamos A, então verificamos aqui e depois verificamos X X aqui, depois Y.
Em seguida, Z e, em seguida, o objeto de classe.
É por isso que você adivinhou, vamos dar uma olhada no código.
Por que esse pedido?
Bem, a ordem é devido à maneira como estamos passando os parâmetros, você vê que B é passado antes de A
e C.
Isso significa que a ordem de MRO será B, então A.
Mas espere, depois do BNA, o que foi isso?
Bem, depois de B e A, temos a Classe X, por que X veio antes de Z?
Então, em vez de ir para Z, vamos tornar isso um pouco maior, em vez de ir para o que
pensávamos que seria Z.
Vai para X, depois para Y, Lindsey e depois para o objeto.
Isso ocorre por causa do algoritmo que eles usam para fazer MRO, que é chamado de profundidade para uma pesquisa.
Agora, isso está além do escopo do curso, mas como você pode ver, é um pouco confuso.
E, na verdade, o Python realmente mudou as regras de MRO do que tínhamos anteriormente nas versões mais recentes
do Python.
Então essa é mais uma daquelas coisas que foram atualizadas.
Mas estou mostrando isso porque você nunca fará o teste do produto.
Se você está escrevendo um código onde a herança se parece com isso, eu argumento que você está escrevendo um
código ruim porque isso é muito complicado, ainda não escrevemos nenhum código realmente dentro dessas classes, e
já é confuso.
Portanto, o MRO existe como uma forma de definir a ordem que você vai herdar e você sempre pode usar a função MRO
ou Dundar para verificar isso, mas o motivo pelo qual eu o trouxe aqui não é apenas para tentar confundi-lo.
A razão é que existe.
No entanto, você não deve estruturar seu código dessa maneira.
Isso não significa que isso não aconteça na natureza.
Sim, é verdade, mas pelo menos você tem uma maneira de verificar e talvez depurar seu código quando vê um
problema como este.
Vou deixar um recurso para você sobre MRO se você estiver realmente curioso e realmente quiser entender
como esse algoritmo funciona e como essa ordem é realmente determinada.
Mas a principal lição é que esta é a maneira que o Python funciona para determinar, ei, quando
você chama um método ou atributo.
É assim que vou pesquisar a hierarquia de heranças, tudo bem, se seu cérebro doer.
Não se preocupe.
Também o meu.
Faça uma pausa e vejo vocês no próximo vídeo da.