Dataclasses (@dataclass, Python 3.7+) suna samar da hanyoyi na boilerplate ta otomatik don azuzuwan da yawa suka ajiye bayani. __slots__ shine haɓakawa da ke rage alaala da kuma saurin aiki ta hanyar guje wa __dict__ na kowane misali.
Dataclasses (@dataclass, Python 3.7+) suna samar da hanyoyi na boilerplate ta otomatik don azuzuwan da yawa suka ajiye bayani. __slots__ shine haɓakawa da ke rage alaala da kuma saurin aiki ta hanyar guje wa __dict__ na kowane misali.
from dataclasses import dataclass
# ❌ without dataclass — lots of repetitive boilerplate
class Point:
def __init__(self, x, y):
self.x = x; self.y = y
def __repr__(self):
return f"Point(x={self.x}, y={self.y})"
def __eq__(self, other):
return (self.x, self.y) == (other.x, other.y)
# ✅ with @dataclass — all of the above generated automatically
@dataclass
class Point:
x: int
y: int
p = Point(1, 2)
p # Point(x=1, y=2) — __repr__ generated
p == Point(1, 2) # True — __eq__ generated
@dataclass yana samar da __init__, __repr__, __eq__ (da kuma zasu iya samar da odar/hashing) daga filayen da aka sanya alamomi — kuma yana cire boilerplate mai wahala, da yawa kuskure.
from dataclasses import dataclass, field
@dataclass(frozen=True) # frozen → immutable (hashable, usable as dict key)
class Config:
name: str
tags: list = field(default_factory=list) # mutable default done safely
timeout: int = 30 # default value
frozen=True yana sa misalai ba za su iya canjewa ba; field(default_factory=list) yana ba mabukacin ƙirar abin asali mai kyau (kwa guje wa hankalin cikakken bambaba-babbar canji).
# normally, each instance has a __dict__ to store attributes (flexible but memory-heavy)
class Regular:
def __init__(self, x, y): self.x, self.y = x, y
# __slots__ → fixed attribute set, NO per-instance __dict__
class Slotted:
__slots__ = ("x", "y") # only these attributes allowed
def __init__(self, x, y): self.x, self.y = x, y
s = Slotted(1, 2)
s.z = 3 # ❌ AttributeError — can't add attributes not in __slots__
A al'ada kowane misali yana ajiye abubuwan siyan a cikin __dict__ mai sauya. __slots__ yana bayyana tsari na ƙididdige abubuwan da aka ajiye a cikin gida mai ƙarfi, tsari na ƙididdige - kuma yana rage alaala da saurin aiki, amma sakamakon watsi da jingina (babu lissafin kwatance kwatan abubuwan).
@dataclass(slots=True) # Python 3.10+ — dataclass WITH __slots__
class Point:
x: int
y: int
@dataclass → any class that's mostly data (DTOs, configs, records) — cleaner, less code
__slots__ → when you create MANY instances (millions) and memory/speed matters
(e.g. nodes in a big data structure, large simulations)
Dataclasses sune abubuwa na zamani da aka amfani da su da yawa waɗanda suke kawar da boilerplate mai maimaita don azuzuwan da suke ajiye bayani — wanda ke sa lamari ya yi kyau, mai kara kuskure, da kuma saurin karatu (samar da otomatik __init__/__repr__/__eq__, da kuma ba da kyau da mabukacin ƙirar abin asali).
Su ne hanyar zamani ta fuskantar nata da hanyoyi ta hannu don tsara irin waɗannan azuzuwan ko amfani da namedtuple lokaci da kuke buƙata sauya/hanyoyi. __slots__ shine haɓakawa ta niyya da ke rage alaala da saurin aiki ta hanya da ta amfani lokaci da kuka samar da yawancin misalan abubuwa.
Sanin dukansu — @dataclass don tsartar bayani ta yau yau da kyau da __slots__ (yanzu za'a iya haɗa ta hanyar slots=True) don hanyoyin gida-iska — yana nuna al'adu na jiya na rubutu azuzuwan Python da kyau, da kuma bakin tsari.