Ответ
Модуль 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__.