Ответ
dataclass — это декоратор, представленный в Python 3.7 (модуль dataclasses), который автоматически генерирует стандартные специальные методы для классов, основное предназначение которых — хранение данных. Это позволяет значительно сократить шаблонный код (boilerplate).
Что генерируется автоматически?
Для полей, определенных с аннотациями типов, @dataclass может сгенерировать:
__init__(): Конструктор для инициализации всех полей.__repr__(): Читабельное строковое представление объекта.__eq__(): Метод сравнения на равенство по значениям полей.- При необходимости:
__lt__(),__le__(),__gt__(),__ge__()(приorder=True).
Базовый пример:
from dataclasses import dataclass
from typing import Optional
@dataclass
class Transaction:
"""Класс для представления финансовой транзакции."""
transaction_id: int
amount: float
currency: str = "USD" # Поле со значением по умолчанию
status: Optional[str] = None # Поле, которое может быть None
# Автоматически созданный __init__
tx1 = Transaction(1, 99.99, "EUR", "completed")
tx2 = Transaction(2, 50.0) # currency="USD", status=None
# Автоматически созданный __repr__
print(tx1) # Transaction(transaction_id=1, amount=99.99, currency='EUR', status='completed')
# Автоматически созданный __eq__
print(tx1 == Transaction(1, 99.99, "EUR", "completed")) # True
Практические применения и особенности:
-
DTO (Data Transfer Object): Идеальны для передачи структурированных данных между слоями приложения, например, возврата из API или передачи в очередь сообщений.
@dataclass class APIResponse: success: bool data: dict error_message: str = "" -
Конфигурация: Хранение настроек приложения в типизованном виде.
-
Неизменяемые объекты: Параметр
frozen=Trueделает объект неизменяемым (генерирует__setattr__, который вызывает исключение).@dataclass(frozen=True) class Point: x: float y: float -
Кастомное поведение: В
dataclassможно добавлять обычные методы.
Чем не является dataclass? Это не замена полноценным ORM-моделям (как в SQLAlchemy или Django ORM) для сложного взаимодействия с базой данных, хотя может использоваться совместно с ними. Его главная цель — устранить рутину при создании классов-контейнеров для данных.