typing.Self representa o tipo concreto da classe em que um método é chamado. Em APIs fluentes, ele preserva a subclasse depois de retornar self, sem declarar manualmente um TypeVar limitado.

from typing import Self

class Consulta:
    def __init__(self) -> None:
        self.filtros: list[str] = []

    def filtrar(self, expressao: str) -> Self:
        self.filtros.append(expressao)
        return self

class ConsultaAuditada(Consulta):
    pass

consulta = ConsultaAuditada().filtrar("ativo = true")

No exemplo, o verificador entende que filtrar() sobre ConsultaAuditada continua produzindo ConsultaAuditada. O mesmo padrão funciona em classmethods que constroem cls e em __enter__() quando o context manager retorna a própria instância.

Boas práticas

Não anote com Self um método que sempre cria explicitamente a classe base, pois uma chamada pela subclasse não retornará o subtipo prometido. Para versões anteriores ao Python 3.11, avalie o backport em typing_extensions de acordo com a política de compatibilidade do projeto.

Conecte o conceito ao guia de type hints e aos usos de classmethod e staticmethod.

A documentação oficial de typing.Self, consultada em 22 de julho de 2026, detalha a API e seus limites.