Herança & MRO
Python suporta herança múltipla e resolve métodos com a Ordem de Resolução de Métodos (MRO). super() percorre essa ordem - essencial para cadeias cooperativas de __init__ em mixins.
Busque em todas as páginas da documentação
Python suporta herança múltipla e resolve métodos com a Ordem de Resolução de Métodos (MRO). super() percorre essa ordem - essencial para cadeias cooperativas de __init__ em mixins.
class LogMixin:
def log(self, msg: str) -> None:
print(f"[{self.__class__.__name__}] {msg}")
class Service(LogMixin):
def run(self) -> None:
self.log("starting")Quando usar isso:
class Base:
def __init__(self) -> None:
self.base_init = True
class TrackingMixin:
def __init__(self, *args, **kwargs) -> None:
self.tracked = True
super().__init__(*args, **kwargs)
class TimestampMixin:
def __init__(self, *args, **kwargs) -> None:
self.timestamped = True
super().__init__(*args, **kwargs)
class Event(TrackingMixin, TimestampMixin, Base):
pass
if __name__ == "__main__":
e = Event()
print(e.tracked, e.timestamped, e.base_init)
print(Event.mro())O que isso demonstra:
super().__init__ para cada classe no MRO uma vezEvent.mro() mostra a ordem de resolução para depuração__init__ dos mixins rodam antes que a cadeia Base seja completadasuper() - Pula para a próxima classe no MRO, não necessariamente o pai direto.super() chama a próxima implementação.__init__ - Toda classe no padrão cooperativo deve chamar super().__init__.HelpfulClass.mro() # lista de classes na ordem de busca
HelpfulClass.__mro__ # forma de tupla# chamada explícita de sobrescrita
class Child(Parent):
def save(self) -> None:
super().save()
self.post_save_hook()super() faltando no mixin - Quebra a cadeia - algumas bases nunca inicializam. Correção: Sempre use super().__init__(*args, **kwargs) em mixins.__init__.super() sem bases cooperativas - Classes legadas que não chamam super quebram o padrão. Correção: Adapte ou evite herança múltipla.| Alternativa | Usar Quando | Não Usar Quando |
|---|---|---|
| Composição | Relacionamentos "tem-um" | Polimorfismo "é-um" verdadeiro |
| Tipagem de protocolo | Interfaces estruturais | Necessidade de implementação compartilhada |
| Funções + dispatch | Reutilização de comportamento simples | O padrão template method se encaixa |
| Herança única | Hierarquia clara | Apenas uma camada de mixin necessária |
Ordem em que Python busca atributos/métodos nas bases. Imprima com Class.mro().
super() respeita o MRO para herança múltipla - um pai codificado explicitamente ignora mixins cooperativos.
Poucos e pequenos são aceitáveis. Muitos mixins sinalizam um "cheiro" de design - considere composição.
Tecnicamente sim - observe a clareza da API e as surpresas do MRO. Frequentemente, a composição é mais clara.
Uma ABC pode ficar no MRO, exigindo métodos antes das classes concretas.
Chame super().__init__ a menos que esteja substituindo deliberadamente toda a cadeia - documente o motivo.
Atributos de instância sombreiam métodos de classe - descritores e descritores de dados adicionam nuances.
Os slots da classe filha devem incluir uma declaração vazia dos slots da classe pai - complexo; leia a documentação antes de combinar.
Afirme Class.mro()[1] == ExpectedParent quando a ordem do mixin for crítica.
Padrões como Django/FastAPI frequentemente herdam de classes de framework - siga a documentação do framework para chamadas super.
super com classmethodsVersões do Stack: Esta página foi escrita para Python 3.14.0 (estável 3.14, manutenção 3.13), FastAPI 0.115+, Django 5.2, Flask 3.1, Pydantic 2, PyTorch 2.6+, pandas 2.2+, Polars 1.x, ruff 0.9+, e uv 0.6+.
Revisado por Chris St. John·Última atualização: 16 de jul. de 2026