Usamos cookies para medir audiência e melhorar sua experiência. Você pode aceitar ou recusar a qualquer momento. Veja sobre o iMasters.
Criar objetos imutáveis em Python pode parecer simples à primeira vista, mas na prática, envolve nuances que, se negligenciadas, podem gerar problemas de manutenção e bugs sutis.
---
Muitos desenvolvedores pensam que basta bloquear atributos com métodos como __setattr__ ou usar tuplas. Mas essas abordagens têm limitações. A decisão fica mais saudável quando o time consegue medir o impacto depois.
Por exemplo, sobrescrever __setattr__ para impedir a alteração de atributos impede também a sua inicialização, o que obriga a soluções alternativas. Sem esse critério, a solução pode parecer simples no começo e cara no suporte. O valor aparece melhor quando operação, produto e engenharia olham para o mesmo risco.
Tuplas, por outro lado, oferecem imutabilidade, mas perdem na clareza de acesso aos atributos nomeados, dificultando a leitura do código e aumentando a chance de erros. O valor aparece melhor quando operação, produto e engenharia olham para o mesmo risco. Por isso, o recorte precisa considerar manutenção, validação e caminho de volta. Esse contexto ajuda a separar ganho real de novidade difícil de sustentar.
---
Usar __setattr__ para bloquear alterações é uma estratégia comum, porém, ela dificulta a inicialização do objeto, além de não impedir alterações via manipulação direta do __dict__. Por isso, o recorte precisa considerar manutenção, validação e caminho de volta. Esse contexto ajuda a separar ganho real de novidade difícil de sustentar. A decisão fica mais saudável quando o time consegue medir o impacto depois. Sem esse critério, a solução pode parecer simples no começo e cara no suporte.
Tuplas, embora imutáveis, não representam atributos com nomes explícitos, o que impacta na legibilidade e na facilidade de manutenção. Esse contexto ajuda a separar ganho real de novidade difícil de sustentar. A decisão fica mais saudável quando o time consegue medir o impacto depois. Sem esse critério, a solução pode parecer simples no começo e cara no suporte. O valor aparece melhor quando operação, produto e engenharia olham para o mesmo risco. Por isso, o recorte precisa considerar manutenção, validação e caminho de volta. Esse contexto ajuda a separar ganho real de novidade difícil de sustentar.
No caso das namedtuples, o problema é o método __eq__, que ignora o nome da classe, levando a comparações que podem parecer corretas, mas que escondem erros de lógica. A decisão fica mais saudável quando o time consegue medir o impacto depois. Sem esse critério, a solução pode parecer simples no começo e cara no suporte. O valor aparece melhor quando operação, produto e engenharia olham para o mesmo risco. Por isso, o recorte precisa considerar manutenção, validação e caminho de volta. Esse contexto ajuda a separar ganho real de novidade difícil de sustentar. A decisão fica mais saudável quando o time consegue medir o impacto depois. Sem esse critério, a solução pode parecer simples no começo e cara no suporte.
---
A partir do Python 3.7, a melhor prática é usar dataclasses com o parâmetro frozen=True. Essa abordagem é clara, eficiente e compatível com tipagem, além de garantir imutabilidade. Sem esse critério, a solução pode parecer simples no começo e cara no suporte. Por isso, o recorte precisa considerar manutenção, validação e caminho de volta. Por isso, o recorte precisa considerar manutenção, validação e caminho de volta. Por isso, o recorte precisa considerar manutenção, validação e caminho de volta. Por isso, o recorte precisa considerar manutenção, validação e caminho de volta. Por isso, o recorte precisa considerar manutenção, validação e caminho de volta. Esse contexto ajuda a separar ganho real de novidade difícil de sustentar.
from dataclasses import dataclass
@dataclass(frozen=True)
class Imutavel:
a: int
b: int
Esse método oferece atributos nomeados, desempenho adequado e uma sintaxe limpa, além de evitar problemas de comparação que aconteciam com as namedtuples. Por isso, o recorte precisa considerar manutenção, validação e caminho de volta. Sem esse critério, a solução pode parecer simples no começo e cara no suporte. Sem esse critério, a solução pode parecer simples no começo e cara no suporte. Sem esse critério, a solução pode parecer simples no começo e cara no suporte. O valor aparece melhor quando operação, produto e engenharia olham para o mesmo risco. Sem esse critério, a solução pode parecer simples no começo e cara no suporte. Sem esse critério, a solução pode parecer simples no começo e cara no suporte.
Outra alternativa é usar classes com __slots__ e propriedades somente leitura, mas essa abordagem é mais verbosa e menos idiomática. Esse contexto ajuda a separar ganho real de novidade difícil de sustentar. O valor aparece melhor quando operação, produto e engenharia olham para o mesmo risco. O valor aparece melhor quando operação, produto e engenharia olham para o mesmo risco. Por isso, o recorte precisa considerar manutenção, validação e caminho de volta. O valor aparece melhor quando operação, produto e engenharia olham para o mesmo risco. O valor aparece melhor quando operação, produto e engenharia olham para o mesmo risco. O valor aparece melhor quando operação, produto e engenharia olham para o mesmo risco.
---
Apesar da praticidade, dataclasses frozen podem impactar a performance em cenários de alta frequência, dado que usam mecanismos de cópia e verificação de hash. A decisão fica mais saudável quando o time consegue medir o impacto depois. Por isso, o recorte precisa considerar manutenção, validação e caminho de volta. Por isso, o recorte precisa considerar manutenção, validação e caminho de volta. Por isso, o recorte precisa considerar manutenção, validação e caminho de volta. Esse contexto ajuda a separar ganho real de novidade difícil de sustentar. Por isso, o recorte precisa considerar manutenção, validação e caminho de volta. Por isso, o recorte precisa considerar manutenção, validação e caminho de volta.
Além disso, a imutabilidade é uma decisão que precisa ser bem avaliada, pois impede alterações posteriores, o que pode limitar a flexibilidade em cenários onde mudanças são necessárias. Sem esse critério, a solução pode parecer simples no começo e cara no suporte. Esse contexto ajuda a separar ganho real de novidade difícil de sustentar. Esse contexto ajuda a separar ganho real de novidade difícil de sustentar. Esse contexto ajuda a separar ganho real de novidade difícil de sustentar. Esse contexto ajuda a separar ganho real de novidade difícil de sustentar. A decisão fica mais saudável quando o time consegue medir o impacto depois. Esse contexto ajuda a separar ganho real de novidade difícil de sustentar.
Por fim, usar C extensions para criar objetos verdadeiramente imutáveis é possível, mas aumenta a complexidade do projeto sem ganhos práticos significativos na maioria dos casos. O valor aparece melhor quando operação, produto e engenharia olham para o mesmo risco. A decisão fica mais saudável quando o time consegue medir o impacto depois. A decisão fica mais saudável quando o time consegue medir o impacto depois. A decisão fica mais saudável quando o time consegue medir o impacto depois. A decisão fica mais saudável quando o time consegue medir o impacto depois. Sem esse critério, a solução pode parecer simples no começo e cara no suporte. A decisão fica mais saudável quando o time consegue medir o impacto depois.
---
Sempre que possível, prefira dataclasses frozen. Elas são fáceis de usar, suportadas oficialmente e oferecem um bom equilíbrio entre segurança e produtividade. Por isso, o recorte precisa considerar manutenção, validação e caminho de volta. Sem esse critério, a solução pode parecer simples no começo e cara no suporte. Sem esse critério, a solução pode parecer simples no começo e cara no suporte. Sem esse critério, a solução pode parecer simples no começo e cara no suporte. O valor aparece melhor quando operação, produto e engenharia olham para o mesmo risco. Sem esse critério, a solução pode parecer simples no começo e cara no suporte. Sem esse critério, a solução pode parecer simples no começo e cara no suporte.
Para garantir que o código seja realmente imutável, evite manipular atributos diretamente ou usar métodos que possam alterar o estado, mesmo que o objeto seja marcado como frozen. Esse contexto ajuda a separar ganho real de novidade difícil de sustentar. O valor aparece melhor quando operação, produto e engenharia olham para o mesmo risco. O valor aparece melhor quando operação, produto e engenharia olham para o mesmo risco. O valor aparece melhor quando operação, produto e engenharia olham para o mesmo risco. O valor aparece melhor quando operação, produto e engenharia olham para o mesmo risco. O valor aparece melhor quando operação, produto e engenharia olham para o mesmo risco.
Se precisar de uma imutabilidade mais avançada, considere o uso de bibliotecas específicas ou escrever uma extensão em C, mas avalie se o esforço compensa. A decisão fica mais saudável quando o time consegue medir o impacto depois. Por isso, o recorte precisa considerar manutenção, validação e caminho de volta. Por isso, o recorte precisa considerar manutenção, validação e caminho de volta. Por isso, o recorte precisa considerar manutenção, validação e caminho de volta. Esse contexto ajuda a separar ganho real de novidade difícil de sustentar. Por isso, o recorte precisa considerar manutenção, validação e caminho de volta. Por isso, o recorte precisa considerar manutenção, validação e caminho de volta.
---
A imutabilidade em Python é mais uma questão de convenção e uso correto de ferramentas do que uma limitação da linguagem. Aproveitar os recursos nativos, como dataclasses frozen, ajuda a manter o código mais robusto e de fácil manutenção. Sem esse critério, a solução pode parecer simples no começo e cara no suporte. Esse contexto ajuda a separar ganho real de novidade difícil de sustentar. Esse contexto ajuda a separar ganho real de novidade difícil de sustentar. A decisão fica mais saudável quando o time consegue medir o impacto depois. Esse contexto ajuda a separar ganho real de novidade difícil de sustentar. Esse contexto ajuda a separar ganho real de novidade difícil de sustentar.
ahahaha
Concordo, usar dataclasses frozen realmente ajuda a evitar o problema de objetos mutáveis sem complicar demais. Já passei por situações em que precisar alterar tudo depois virou um pesadelo.
Perfeito! O legal da dataclass é que dá pra combinar com validações extras se precisar, sem perder a simplicidade.
No meu time, a gente prefere usar classes com __slots__ e propriedades só leitura para ceários onde a performance é crítica. Ainda assim, acho que dataclasses é a melhor solução na maioria dos casos.