← Все вопросы

Что такое dataclass и чем он удобнее обычного класса?

Задан 5 месяцев назад479 просмотров3 ответа
16

Постоянно пишу классы, где в __init__ тупо раскидываю аргументы по self.x = x, потом ещё руками делаю __repr__ и __eq__. Слышал, что @dataclass это всё генерит сам. Как им пользоваться и в каких случаях он реально к месту?

3 ответа

25
✓ Принятый ответ — помог автору

@dataclass из модуля dataclasses автоматически генерирует __init__, __repr__ и __eq__ по объявленным полям — ты просто перечисляешь атрибуты с типами:

from dataclasses import dataclass

@dataclass
class Point:
    x: int
    y: int = 0          # значение по умолчанию

p = Point(1, 2)
print(p)               # Point(x=1, y=2)  -- готовый __repr__
print(p == Point(1, 2)) # True            -- готовый __eq__

Без dataclass пришлось бы руками писать __init__, __repr__ и __eq__ — здесь это всё бесплатно. Полезные опции: @dataclass(frozen=True) делает объект неизменяемым и хешируемым (можно в set/ключ словаря), @dataclass(order=True) добавляет сравнения <, > (объекты можно сортировать). Когда применять: когда класс — это в основном «контейнер данных» (координаты, конфиг, запись из БД). Когда не стоит: если у класса сложная логика/много поведения, а данных мало — там обычный класс понятнее.

Михаил Якимов Для значений по умолчанию-списков нужен field(default_factory=list), просто =[] нельзя — та же грабля общего объекта · 4 месяца назад
Даната Толкачева frozen=True + автоматический __hash__ — киллер-фича, экономит кучу boilerplate · 4 месяца назад
8

Это декоратор @dataclass, который по объявленным полям сам пишет __init__, __repr__ и __eq__. Меньше шаблонного кода. Идеален для классов-«контейнеров данных».

4

Декоратор @dataclass.

Ваш ответ

Войдите, чтобы ответить на вопрос.
Поддержать проект