0Pricing
Python Academy · Aula

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=True torna as instâncias imutáveis.
  • order=True adiciona 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=True impede modificações e torna as instâncias hasháveis.
  • Use replace() para criar cópias modificadas.
  • order=True gera 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

  1. Definindo uma classe de dados
  2. Valores padrão e field()
  3. Opções de imutabilidade e comparação
  4. A biblioteca attrs
← Voltar para Python Academy