Dataclasses Avansate în Python (slots=True și kw_only=True) în Python

Clase și obiecte Python 3.10+

Ghid complet pentru dataclasses moderne în Python: reducerea consumului de memorie RAM cu slots=True, siguranță la apelare cu kw_only=True și imuabilitate cu frozen=True.

Sintaxă
@dataclass(slots=True, kw_only=True, frozen=True)
class Tranzactie:
    id: int
    total: float

Modulul dataclasses a transformat modul în care dezvoltatorii Python creează structuri de date, generând automat metodele standard __init__, __repr__ și __eq__. În versiunile recente (Python 3.10+), decoratorul @dataclass a primit parametri critici pentru performanță extremă și arhitectură sigură: slots=True și kw_only=True.

Definirea unei clase de înaltă performanță cu slots=True
from dataclasses import dataclass

# În mod normal, fiecare instanță Python deține un dicționar '__dict__' intern,
# care consumă memorie RAM și încetinește accesul la atribute.
# Cu slots=True, atributele sunt stocate într-un vector C compact cu dimensiune fixă:

@dataclass(slots=True)
class PunctSenzor:
    timestamp: int
    temperatura: float
    umiditate: float

# Comparație memorie pe 1.000.000 de instanțe:
# Fără slots: ~160 MB RAM
# Cu slots=True: ~48 MB RAM (o economie de peste 65% din memorie!)

Parametrul kw_only=True (Keyword-Only Arguments)

În echipe mari și cod de producție, crearea de obiecte cu argumente poziționale nespecificate (ex: Tranzactie(105, 500.0, True, False)) este o sursă garantată de bug-uri, deoarece dezvoltatorii pot inversa cu ușurință ordinea parametrilor booleeni. Setând kw_only=True, compilatorul forțează transmiterea numelui fiecărui parametru:

Forțarea numirii parametrilor cu kw_only
@dataclass(kw_only=True)
class ContClient:
    id: int
    nume: string
    este_activ: bool = True
    balanta: float = 0.0

# apel_gresit = ContClient(101, "Dan", True, 250.0)
# TypeError: ContClient.__init__() takes 1 positional argument but 5 were given!

# APEL CORECT ȘI SIGUR:
client = ContClient(id=101, nume="Dan", balanta=250.0)

Alte Opțiuni Esențiale în @dataclass

  • frozen=True: Face instanța complet imuabilă după creare. Orice reatribuire (obj.val = 10) aruncă FrozenInstanceError. Obiectele înghețate generează automat metoda __hash__, putând fi folosite ca chei în dicționare sau elemente în set-uri!
  • order=True: Generează automat metodele de comparare <, <=, >, >= pe baza ordinii de declarare a atributelor, permițând sortarea directă cu sorted(lista_obiecte).