Dataclasses (датаклассы) — это декоратор из модуля dataclasses, который автоматически генерирует "магические" методы (__init__, __repr__, __eq__ и др.) для классов, хранящих данные. Они были введены в PEP 557 для уменьшения шаблонного кода.
__init__, __repr__ вручную.frozen=True.class Person:
def __init__(self, name: str, age: int):
self.name = name
self.age = age
def __repr__(self):
return f"Person(name={self.name}, age={self.age})"
def __eq__(self, other):
return (self.name, self.age) == (other.name, other.age)
from dataclasses import dataclass
@dataclass
class Person:
name: str
age: int
Теперь класс автоматически получает __init__, __repr__, __eq__!
frozen=True: делает объект неизменяемым (как namedtuple).order=True: генерирует методы сравнения (__lt__, __gt__ и др.).slots=True: оптимизация памяти через __slots__.@dataclass(frozen=True, order=True)
class Point:
x: float
y: float
Можно задавать прямо в объявлении атрибутов:
@dataclass
class Config:
timeout: int = 10
verbose: bool = False
Для сложных сценариев используйте field():
from dataclasses import field
@dataclass
class Student:
name: str
grades: list[int] = field(default_factory=list, repr=False)
Здесь grades инициализируется пустым списком и исключается из __repr__.
Датаклассы поддерживают наследование:
@dataclass
class Base:
id: int
@dataclass
class User(Base):
username: str
Можно добавлять свои методы как в обычный класс:
@dataclass
class Rectangle:
width: float
height: float
def area(self) -> float:
return self.width * self.height
from dataclasses import asdict, astuple
rect = Rectangle(3.0, 4.0)
print(asdict(rect)) # ```> {'width': 3.0, 'height': 4.0}
dataclass может быть недостаточно.slots=True ускоряет доступ к атрибутам, но запрещает динамическое добавление полей.Dataclasses идеальны для:
Пример с подсветкой (как в VSCode):
from dataclasses import dataclass, field
@dataclass(order=True)
class Product:
id: int
name: str
price: float = field(default=0.0, compare=False)
tags: list[str] = field(default_factory=list)