Dataclasses (Python 3.7+)
Python · Core Language · Run with python3
Explanation
`@dataclass` auto-generates `__init__`, `__repr__`, `__eq__` (and optionally `__lt__`, `__hash__`, `__post_init__`) from class-level annotations. With `frozen=True` the class is immutable (and hashable). `field()` controls defaults, whether a field appears in `__repr__`, and `default_factory` for mutable defaults. Python 3.10 added `slots=True` for automatic `__slots__` (lower memory, faster attribute access).
Real-World Scenario
API response models, configuration objects, and database row types are all naturally dataclasses: lots of fields, equality by value, serializable. They eliminate the boilerplate of writing `__init__` + `__repr__` + `__eq__` by hand — which is a constant source of maintenance bugs. ```python from dataclasses import dataclass, field from typing import ClassVar @dataclass(order=True, frozen=True) class Version: major: int minor: int patch: int = 0 _registry: ClassVar[list] = [] # ClassVar excluded from __init__ def __str__(self) -> str: return f"{self.major}.{self.minor}.{self.patch}" @dataclass class Package: name: str version: Version dependencies: list[str] = field(default_factory=list) _internal: str = field(default="", repr=False) v1 = Version(3, 11) v2 = Version(3, 12) print(v1 < v2) # True (order=True generates __lt__) print(str(v1)) # 3.11.0 pkg = Package("requests", v2, ["certifi", "urllib3"]) print(pkg) # Package(name='requests', version=3.12.0, dependencies=['certifi', 'urllib3']) ```
Quick Snippet
from dataclasses import dataclass, field
from typing import ClassVar
@dataclass(order=True, frozen=True)
class Version:
major: int
minor: int
patch: int = 0
_registry: ClassVar[list] = [] # ClassVar excluded from __init__
def __str__(self) -> str:
return f"{self.major}.{self.minor}.{self.patch}"
@dataclass
class Package:
name: str
version: Version
dependencies: list[str] = field(default_factory=list)
_internal: str = field(default="", repr=False)
v1 = Version(3, 11)
v2 = Version(3, 12)
print(v1 < v2) # True (order=True generates __lt__)
print(str(v1)) # 3.11.0
pkg = Package("requests", v2, ["certifi", "urllib3"])
print(pkg)
# Package(name='requests', version=3.12.0, dependencies=['certifi', 'urllib3'])Full Example
# Compile: python3 dataclasses.py
# Output:
# True
# 3.11.0
# Package(name='requests', version=3.12.0, dependencies=['certifi', 'urllib3'])
from dataclasses import dataclass, field
from typing import ClassVar
@dataclass(order=True, frozen=True)
class Version:
major: int
minor: int
patch: int = 0
_registry: ClassVar[list] = []
def __str__(self) -> str:
return f"{self.major}.{self.minor}.{self.patch}"
@dataclass
class Package:
name: str
version: Version
dependencies: list[str] = field(default_factory=list)
_internal: str = field(default="", repr=False)
v1 = Version(3, 11)
v2 = Version(3, 12)
print(v1 < v2)
print(str(v1))
pkg = Package("requests", v2, ["certifi", "urllib3"])
print(pkg)
# post_init for derived fields
@dataclass
class Rectangle:
width: float
height: float
area: float = field(init=False)
def __post_init__(self):
self.area = self.width * self.height
r = Rectangle(4.0, 5.0)
print(f"Rectangle area: {r.area}")
python3 dataclasses.py