CodeNebula
Python🔧Core Languagebeginner

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

snippet.py
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

dataclasses.py
# 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}")
Run command
python3 dataclasses.py