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 додатково перевіряє під час виконання.

Див. також: анотації типів