Что такое Data Class в Python?

«Что такое Data Class в Python?» — вопрос из категории Python, который задают на 33% собеседований Data Инженер. Ниже — развёрнутый ответ с разбором ключевых моментов.

Ответ

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

Практические применения и особенности:

  1. DTO (Data Transfer Object): Идеальны для передачи структурированных данных между слоями приложения, например, возврата из API или передачи в очередь сообщений.

    @dataclass
    class APIResponse:
        success: bool
        data: dict
        error_message: str = ""
  2. Конфигурация: Хранение настроек приложения в типизованном виде.

  3. Неизменяемые объекты: Параметр frozen=True делает объект неизменяемым (генерирует __setattr__, который вызывает исключение).

    @dataclass(frozen=True)
    class Point:
        x: float
        y: float
  4. Кастомное поведение: В dataclass можно добавлять обычные методы.

Чем не является dataclass? Это не замена полноценным ORM-моделям (как в SQLAlchemy или Django ORM) для сложного взаимодействия с базой данных, хотя может использоваться совместно с ними. Его главная цель — устранить рутину при создании классов-контейнеров для данных.