0Pricing
Python Academy · Aula

Valores padrão e field()

Defina valores padrão e use as opções de field().

Valores padrão e field() é uma aula grátis de Python Academy no CoddyKit. Esta é a aula 2 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.

Definindo valores padrão para campos

Assim como os parâmetros de funções, os campos de classes de dados podem ter valores padrão. Um campo com valor padrão pode ser omitido ao criar uma instância.

from dataclasses import dataclass

@dataclass
class Server:
    host: str
    port: int = 8080

print(Server('localhost'))
print(Server('example.com', 443))

A ordem é importante

Os campos com valores padrão devem vir depois dos campos sem valores padrão, exatamente como os argumentos de funções. Caso contrário, o Python gera um TypeError quando a classe é definida.

from dataclasses import dataclass

@dataclass
class User:
    name: str       # required
    active: bool = True   # optional

print(User('Alice'))

A armadilha dos valores padrão mutáveis

Não pode usar um objeto mutável, como uma lista ou um dicionário, como valor padrão direto. Todas as instâncias compartilhariam o mesmo objeto. O Python detecta isso e gera um ValueError para proteger você.

from dataclasses import dataclass
from typing import List

# This raises ValueError at class definition time:
try:
    @dataclass
    class Bad:
        items: List[int] = []
except ValueError as e:
    print('Error:', e)

field(default_factory=...)

Para definir um valor padrão mutável, use field(default_factory=...). A fábrica é chamada para cada nova instância, portanto cada instância recebe seu próprio objeto novo.

from dataclasses import dataclass, field
from typing import List

@dataclass
class Cart:
    items: List[str] = field(default_factory=list)

a = Cart()
a.items.append('apple')
b = Cart()
print(a.items, b.items)

default versus default_factory

Use field(default=...) para valores imutáveis quando também precisar de outras opções de field(). Use default_factory para qualquer valor mutável. Não pode passar os dois ao mesmo tempo.

from dataclasses import dataclass, field

@dataclass
class Config:
    retries: int = field(default=3)
    tags: list = field(default_factory=list)

print(Config())

Excluindo um campo de repr

A opção repr=False oculta um campo do __repr__ gerado. Isso é útil para segredos ou grandes buffers internos.

from dataclasses import dataclass, field

@dataclass
class Account:
    user: str
    token: str = field(repr=False, default='secret')

print(Account('alice'))

Excluindo um campo da comparação

Com compare=False, um campo é ignorado pelo __eq__ gerado (e pela ordenação). Duas instâncias podem ser iguais mesmo que esse campo seja diferente.

from dataclasses import dataclass, field

@dataclass
class Event:
    name: str
    timestamp: float = field(compare=False, default=0.0)

print(Event('login', 1.0) == Event('login', 99.0))

Campos init=False

Definir init=False mantém um campo fora de __init__. Em geral, combina-se isso com um valor padrão ou define-se o campo em __post_init__.

from dataclasses import dataclass, field

@dataclass
class Circle:
    radius: float
    area: float = field(init=False, default=0.0)

c = Circle(2.0)
print(c)

__post_init__ para valores derivados

Defina __post_init__ para executar código logo depois do __init__ gerado. Esse é o lugar natural para calcular campos derivados de outros campos.

from dataclasses import dataclass, field

@dataclass
class Circle:
    radius: float
    area: float = field(init=False, default=0.0)

    def __post_init__(self):
        self.area = 3.14159 * self.radius ** 2

print(Circle(2.0))

Armazenando metadados

O argumento metadata associa um mapeamento arbitrário a um campo. O Python o ignora, mas as ferramentas e o seu próprio código podem lê-lo para obter documentação ou orientações de validação.

from dataclasses import dataclass, field, fields

@dataclass
class Product:
    price: float = field(metadata={'unit': 'USD'})

for f in fields(Product):
    print(f.name, f.metadata)

Combinando opções de field()

As opções se acumulam. Um único campo pode ser ocultado da repr, ficar fora da comparação e ter um valor padrão ao mesmo tempo.

from dataclasses import dataclass, field

@dataclass
class Session:
    user: str
    token: str = field(default='x', repr=False, compare=False)

print(Session('alice'))
print(Session('alice') == Session('alice', token='different'))

Verificação rápida

Como deve definir uma lista vazia como valor padrão de um campo de uma classe de dados?

Recapitulação

Aprendeu a definir valores padrão e usar opções de field().

  • Os campos com valores padrão vêm depois dos campos obrigatórios.
  • Use default_factory para valores padrão mutáveis.
  • repr, compare, init e metadata ajustam cada campo.
  • __post_init__ calcula valores derivados.

Perguntas Frequentes

A aula “Valores padrão e field()” é grátis?

Sim — o texto completo de “Valores padrão e field()” é 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 “Valores padrão e field()”?

Defina valores padrão e use as opções de field(). 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 2 de 4.

Quanto tempo leva a aula “Valores padrão e field()”?

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