EMZETT.
Войти

Python: dataclass

Коротко: @dataclass автоматически создаёт __init__, __repr__ и сравнения для класса, который в основном хранит данные. Это экономит много шаблонного кода.

Подробнее: Вместо ручного написания конструктора и текстового представления достаточно перечислить поля с типами.

Подробности

from dataclasses import dataclass, field
 
@dataclass
class Product:
    name: str
    price: float
    tags: list[str] = field(default_factory=list)
  • Автоматически: Product("Кружка", 4.5) работает, print(p) показывает Product(name='Кружка', price=4.5, tags=[]), == сравнивает поле за полем.
  • Значения по умолчанию: Изменяемые значения по умолчанию (списки, словари) никогда не задавать напрямую, а через field(default_factory=list).
  • Параметры: frozen=True делает объекты неизменяемыми и хэшируемыми, order=True создаёт сравнения для сортировки, slots=True экономит память.
  • __post_init__: Выполняется после конструктора, например для проверок или производных полей.
  • Помощники: asdict(p) и replace(p, price=5) (копия с изменением).
  • Сравнение: NamedTuple неизменяем и похож на кортеж, у dict нет фиксированной структуры, Pydantic дополнительно проверяет во время выполнения.

См. также: аннотации типов