Ответ
Декоратор @dataclass из модуля dataclasses автоматически генерирует для класса специальные методы, такие как __init__(), __repr__(), __eq__() и другие. Это значительно упрощает создание классов, основная цель которых — хранение данных (DTO, структуры).
Ключевые особенности и преимущества
- Краткость кода: Не нужно вручную писать шаблонные методы. Класс становится чище и читабельнее.
- Автоматическая генерация: По умолчанию создаются
__init__,__repr__,__eq__и__hash__(если класс неизменяем). - Типизация:
dataclassesтесно интегрированы с аннотациями типов Python. - Неизменяемость: Опция
frozen=Trueделает экземпляры класса неизменяемыми, что полезно для создания безопасных и предсказуемых объектов. - Гибкость: Можно управлять генерацией методов (
compare=False,repr=False) и задавать значения по умолчанию, в том числе для изменяемых типов черезfield.
Пример
from dataclasses import dataclass, field
from typing import List
@dataclass(frozen=True) # frozen=True делает объект неизменяемым
class User:
user_id: int
username: str
roles: List[str] = field(default_factory=list) # Правильный способ для mutable default
# Создание экземпляра
user = User(1, 'admin', ['moderator', 'editor'])
# __repr__ сгенерирован автоматически
print(user)
# Вывод: User(user_id=1, username='admin', roles=['moderator', 'editor'])
# Попытка изменить поле вызовет ошибку FrozenInstanceError
# user.username = 'new_admin' # -> dataclasses.FrozenInstanceError