Opções de imutabilidade e comparação
Crie classes de dados imutáveis e ordenadas.
Opções de imutabilidade e comparação é uma aula grátis de Python Academy no CoddyKit. Esta é a aula 3 de 4. Você pode ler a aula completa abaixo gratuitamente — depois pratica ao vivo no navegador com um editor de código integrado e um tutor de IA 24/7. Faz parte do caminho de aprendizado de Python Academy, e seu progresso é sincronizado entre a web e o app CoddyKit. O curso de Python Academy inclui 4 aulas no total.
Opções do decorador
O decorador @dataclass aceita argumentos nomeados que controlam quais métodos ele gera. Os mais úteis são frozen e order.
frozen=Truetorna as instâncias imutáveis.order=Trueadiciona operadores de comparação.
Classes de dados imutáveis
Com frozen=True, a classe gerada bloqueia a atribuição de atributos depois da construção. Qualquer tentativa gera FrozenInstanceError.
from dataclasses import dataclass, FrozenInstanceError
@dataclass(frozen=True)
class Point:
x: int
y: int
p = Point(1, 2)
try:
p.x = 99
except FrozenInstanceError as e:
print('Cannot modify:', e)Por que a imutabilidade ajuda
Objetos imutáveis são mais fáceis de compreender: seu valor nunca muda depois da criação, portanto é seguro compartilhá-los entre funções e fluxos de execução. Eles também podem ser usados com segurança como chaves de dicionários e membros de conjuntos.
Imutabilidade Permite Hashing
Uma classe de dados congelada é hashável por padrão, portanto pode usar instâncias em conjuntos ou como chaves de dicionários. Classes de dados mutáveis não são hasháveis, a menos que opte por isso.
from dataclasses import dataclass
@dataclass(frozen=True)
class Point:
x: int
y: int
seen = {Point(0, 0), Point(1, 1), Point(0, 0)}
print(len(seen))Substituindo Valores Congelados
Como não pode modificar uma instância congelada, use dataclasses.replace() para criar uma cópia modificada. O original permanece intacto.
from dataclasses import dataclass, replace
@dataclass(frozen=True)
class Point:
x: int
y: int
p = Point(1, 2)
q = replace(p, y=99)
print(p)
print(q)Classes de Dados Ordenadas
Por padrão, uma classe de dados oferece suporte apenas a ==. Adicione order=True para também gerar <, <=, > e >=.
from dataclasses import dataclass
@dataclass(order=True)
class Version:
major: int
minor: int
print(Version(1, 2) < Version(1, 5))
print(Version(2, 0) > Version(1, 9))Como a Ordenação Faz Comparações
A ordenação compara os campos como uma tupla, da esquerda para a direita, na ordem em que foram declarados. O primeiro campo é o mais significativo.
from dataclasses import dataclass
@dataclass(order=True)
class Version:
major: int
minor: int
# major compared first, then minor
print(Version(1, 9) < Version(2, 0))Ordenando Instâncias de Classes de Dados
Como as classes de dados ordenadas definem os operadores de comparação, pode ordenar diretamente uma lista delas com sorted().
from dataclasses import dataclass
@dataclass(order=True)
class Score:
points: int
name: str
data = [Score(50, 'B'), Score(90, 'A'), Score(70, 'C')]
for s in sorted(data):
print(s)Controlando a Chave de Ordenação
Para ordenar por algo diferente da ordem natural dos campos, coloque primeiro um campo de ordenação oculto com field(init=False) e defina-o em __post_init__. Os outros campos podem ser excluídos da comparação com compare=False.
from dataclasses import dataclass, field
@dataclass(order=True)
class Item:
sort_index: int = field(init=False, repr=False)
name: str = field(compare=False, default='')
priority: int = 0
def __post_init__(self):
self.sort_index = self.priority
print(Item(name='b', priority=2) > Item(name='a', priority=1))Combinando Imutabilidade e Ordenação
Pode combinar opções. Uma classe de dados congelada e ordenada é um tipo de valor imutável e comparável perfeito, ideal para chaves, números de versão ou coordenadas.
from dataclasses import dataclass
@dataclass(frozen=True, order=True)
class SemVer:
major: int
minor: int
patch: int
versions = {SemVer(1, 0, 0): 'stable'}
print(SemVer(1, 0, 0) < SemVer(1, 1, 0))
print(versions[SemVer(1, 0, 0)])Igualdade e o Valor Padrão
A opção eq controla se __eq__ é gerado. Por padrão, ela é True. Observe que order=True exige eq=True, pois a ordenação se baseia na igualdade.
from dataclasses import dataclass
@dataclass(eq=True)
class Tag:
name: str
print(Tag('x') == Tag('x'))
print(Tag('x') == Tag('y'))Verificação Rápida
O que acontece se atribuir um valor a um campo de uma instância de classe de dados congelada?
Recapitulação
Aprendeu a criar classes de dados imutáveis e ordenadas.
frozen=Trueimpede modificações e torna as instâncias hasháveis.- Use
replace()para criar cópias modificadas. order=Truegera operadores de comparação que comparam os campos como uma tupla.- Combine ambos para criar tipos de valor sólidos.
Perguntas Frequentes
A aula “Opções de imutabilidade e comparação” é grátis?
Sim — o texto completo de “Opções de imutabilidade e comparação” é grátis para ler aqui na web. Para praticá-la interativamente (um editor de código integrado e um tutor de IA 24/7) e desbloquear o restante do curso de Python Academy, atualize para CoddyKit PRO. O curso de Python Academy inclui 4 aulas no total.
O que vou aprender em “Opções de imutabilidade e comparação”?
Crie classes de dados imutáveis e ordenadas. Você pratica Python Academy com código prático que executa diretamente no navegador, e um tutor de IA 24/7 responde suas dúvidas enquanto trabalha na aula.
Preciso ter experiência prévia para começar Python Academy?
Nenhuma experiência prévia é necessária. Python Academy no CoddyKit é estruturado para alunos iniciantes até avançados, então você pode começar aqui ou desde o início e aprender no seu ritmo. Esta é a aula 3 de 4.
Quanto tempo leva a aula “Opções de imutabilidade e comparação”?
A maioria das aulas CoddyKit leva cerca de 5–10 minutos. Cada uma é compacta e interativa, então você faz progresso constante e retoma exatamente de onde parou entre web e app.
Posso escrever e executar código nesta aula de Python Academy?
Sim. Cada aula de Python Academy inclui um editor de código integrado, então você escreve e executa código real direto no navegador e recebe feedback de IA instantaneamente — nenhuma configuração local necessária.
Todas as aulas deste curso
- Definindo uma classe de dados
- Valores padrão e field()
- Opções de imutabilidade e comparação
- A biblioteca attrs