Ответ
Модуль dataclasses
, входящий в стандартную библиотеку Python с версии 3.7, предоставляет декоратор @dataclass
для автоматической генерации специальных методов в классах, предназначенных для хранения данных.
Основная цель — сократить количество шаблонного (boilerplate) кода, который разработчикам приходилось писать вручную.
Что генерируется по умолчанию:
__init__()
: конструктор для инициализации полей.__repr__()
: строковое представление для отладки (например,Point(x=1.5, y=2.5)
).__eq__()
: метод для сравнения объектов на равенство.
Сравнение "до" и "после":
Без @dataclass
:
class Point:
def __init__(self, x: float, y: float):
self.x = x
self.y = y
def __repr__(self):
return f"Point(x={self.x}, y={self.y})"
def __eq__(self, other):
if not isinstance(other, Point):
return NotImplemented
return self.x == other.x and self.y == other.y
С @dataclass
:
from dataclasses import dataclass
@dataclass
class Point:
x: float
y: float
Дополнительные возможности:
- Создание неизменяемых (immutable) объектов с помощью
@dataclass(frozen=True)
. - Генерация методов сравнения (
__lt__
,__gt__
и др.) с помощью@dataclass(order=True)
. - Тонкая настройка полей с помощью функции
field()
, например, для исключения поля из__init__
или__repr__
.