By ChatGPT:

Um mixin é uma classe em linguagens orientadas a objetos, como Python, que fornece funcionalidades reutilizáveis para outras classes, mas que normalmente não é instanciada por si só. Ao contrário da herança tradicional, onde uma classe filha herda diretamente de uma classe pai, o mixin é usado para adicionar comportamentos específicos a uma classe de forma modular, permitindo que ela mantenha sua herança principal.

Mixins são frequentemente utilizados para evitar duplicação de código, promovendo o princípio da composição ao invés de uma herança profunda, facilitando a extensão de funcionalidades de maneira flexível e organizada.

MRO

==Resumo: o primeiro mixin listado na herança tem precedência sobre os demais, e a classe mais à esquerda substitui as demais==

Em Python, a ordem de sobrescrita de métodos ao usar mixins é determinada pela Metaclass Resolution Order (MRO). A MRO é a ordem na qual as classes são pesquisadas quando um método é chamado. Essa ordem segue uma variação do algoritmo chamado C3 linearization, que assegura que:

  1. As classes de uma hierarquia de herança são percorridas da esquerda para a direita conforme estão na definição da classe.
  2. Cada classe é visitada apenas uma vez.
  3. As classes pai são percorridas antes das classes filhas.

Exemplo:

class Base:
    def metodo(self):
        print("Base")
 
class Mixin1:
    def metodo(self):
        print("Mixin1")
 
class Mixin2:
    def metodo(self):
        print("Mixin2")
 
class MinhaClasse(Mixin1, Mixin2, Base):
    pass
 
obj = MinhaClasse()
obj.metodo()

Explicação:

  • Aqui, MinhaClasse herda de Mixin1, Mixin2 e Base.
  • Quando chamamos obj.metodo(), a ordem de pesquisa será definida pela MRO.
  • A MRO pode ser visualizada usando MinhaClasse.__mro__ ou MinhaClasse.mro().
print(MinhaClasse.mro())

Saída do exemplo:

[<class '__main__.MinhaClasse'>, <class '__main__.Mixin1'>, <class '__main__.Mixin2'>, <class '__main__.Base'>, <class 'object'>]

A ordem de sobrescrita de métodos segue a sequência de classes da MRO. Neste caso, o método de Mixin1 será chamado primeiro, seguido por Mixin2 e Base, se não for encontrado em classes anteriores.

Portanto, o primeiro mixin listado na herança tem precedência sobre os demais, e a classe mais à esquerda substitui as demais.