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)