A Primeira Instância É Composta Por
O que acontece quando você cria a primeira instância de uma classe em Python
Muita gente confunde inicialização de classe com criação de objetos. Quando você escreve obj = MinhaClasse(), o Python na verdade executa duas etapas distintas, e a ordem importa mais do que a maioria dos tutoriais admite. A primeira instância é composta por um conjunto de chamadas que vão da definição da classe até o estado final do objeto. O __new__ é responsável por alocar a memória, enquanto o __init__ preenche os atributos. Isso parece simples até você entrar num cenário onde a classe pai também sobrescreve __new__.
Como entender a primeira instância é composta por
O fluxo começa quando o interpretador lê o class statement. Nesse momento, o corpo da classe é executado, criando o namespace da classe e definindo todos os métodos. Depois, quando a instância é invocada, __new__ recebe a classe como primeiro argumento. Se __new__ retornar uma instância da própria classe, o __init__ é chamado automaticamente. Caso contrário, o __init__ é ignorado. Esse detalhe do __new__ retornar algo diferente é onde muita gente se perde. Eu passei duas horas num projeto debugando um problema onde uma classe que herda de tuple não estava inicializando atributos porque o __new__ retornava uma instância de tuple diretamente, sem passar pelo __init__ esperado. A solução foi chamar explicitamente o __init__ dentro do próprio __new__ ou, quando possível, usar object.__new__(cls) para garantir que o init rodasse corretamente.
Padroes que voce vai encontrar no dia a dia
O padrão mais comum é o construtor simples com __init__, mas existe o singleton que reaproveita a mesma instância. A armadilha aqui é que singleton em Python não funciona bem com herança múltipla e decorators de contexto, a menos que você implemente o controle manualmente usando um dicionário de cache baseado na classe. Outro padrão que aparece frequentemente é o factory method, onde a criação da instância é delegada a uma função ou método estático. Isso é útil quando você precisa de lógica condicional antes de decidir qual classe concreta instanciar. A desvantagem é que o código fica mais difícil de seguir em heranças profundas. Se você trabalha com classes abstratas, note que tentar instanciá-las diretamente dispara codeTypeError. A solução óbvia é criar uma subclass concreta, mas existem casos onde você precisa de comportamentos parciais e o padrão ABC (Abstract Base Class) com registradores pode ser uma alternativa mais limpa do que herdar e sobrescrever tudo.

O que acontece nos bastidores
Quando o Python processa uma declaração de classe, ele executa o corpo da classe no contexto de um novo namespace. Variáveis de classe são criadas ali. Métodos são funções comuns até que sejam acessadas via instância, momento em que se tornam métodos ligados. Isso explica por que funções definidas no corpo da classe não recebem self automaticamente — elas só viram métodos ligados na chamada via instância. O garbage collection também merece atenção. Objetos criados dinamicamente são referenciados até que saiam do escopo. Referencias circulares entre instâncias podem impedir a coleta imediata, dependendo da versão do Python e da implementação do GC.
Dicas práticas que nao aparecem na documentacao
Use __slots__ quando precisar criar milhares de instâncias de uma classe com poucos atributos. Isso reduz significativamente o uso de memória porque elimina o __dict__ por padrão. O tradeoff é que você perde a capacidade de adicionar atributos dinamicamente, então certifique-se de que todos os atributos necessários estão declarados nos slots. Para debugging de inicialização, colocar um print no início do __init__ e do __new__ resolve a maioria dos problemas de order de execução. Não é elegante, mas é rápido e direto. Em projetos grandes, considere usar dataclasses ou attrs em vez de escrever __init__ manualmente. A redução de boilerplate é real, especialmente quando a classe tem muitos atributos e validações simples. A performance é comparable na maioria dos casos práticos.
Se voce estiver construindo bibliotecas ou componentes reutilizaveis, teste a inicializacao com diferentes combinacoes de argumentos. O cenarious mais quebrado costuma ser aquele onde None é passado como valor default e seu codigo nao trata esse caso explicitamente. O resultado é um erro silencioso que só aparece meses depois em producao.
Galeria
-
O QUE SÃO AS INSTÂNCIAS DO JUDICIÁRIO PRIMEIRA INSTÂNCIA, SEGUNDA ... -
Resumo Justiça Federal - JUSTIÇA FEDERAL PRIMEIRA INSTÂNCIA: SEÇÕES ... -
Dicionário de Juridiquês: Instância - Paulo Leite Advogados