Dataclasses (@dataclass, Python 3.7+) تقوم بإنشاء تلقائي للدوال الأساسية للفئات التي تحتفظ بالبيانات بشكل أساسي. __slots__ هي تحسين يقلل استهلاك الذاكرة ويسرع الوصول للخصائص عن طريق تجنب قاموس __dict__ الخاص بكل instance.
Dataclasses (@dataclass, Python 3.7+) تقوم بإنشاء تلقائي للدوال الأساسية للفئات التي تحتفظ بالبيانات بشكل أساسي. __slots__ هي تحسين يقلل استهلاك الذاكرة ويسرع الوصول للخصائص عن طريق تجنب قاموس __dict__ الخاص بكل instance.
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
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 تنشئ __init__ و __repr__ و __eq__ (وإذا لزم الأمر الترتيب والـ hashing) من الحقول المعرّفة بنوع - مما يزيل الكود الممل والعرضة للأخطاء.
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 يجعل instances غير قابلة للتغيير؛ field(default_factory=list) يوفر بأمان قيم افتراضية قابلة للتغيير (تجنباً لمشكلة الافتراضيات المشتركة القابلة للتغيير).
# 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__
عادةً كل instance تخزن الخصائص في قاموس __dict__ ديناميكي. __slots__ تعلن عن مجموعة ثابتة من الخصائص المخزنة في هيكل ثابت ومضغوط بدلاً من ذلك - مما يوفر ذاكرة كبيرة ويسرع الوصول، لكن على حساب المرونة (عدم القدرة على إضافة خصائص عشوائية).
@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 هي ميزة حديثة مستخدمة على نطاق واسع تلغي الكود المتكرر والممل للفئات التي تحتفظ بالبيانات - مما يجعل الكود أنظف وأقل عرضة للأخطاء وأكثر قابلية للقراءة (إنشاء تلقائي للـ __init__/__repr__/__eq__، بالإضافة إلى عدم القابلية للتغيير والافتراضيات الآمنة).
هي البديل الحديث المعياري لكتابة مثل هذه الفئات يدوياً أو استخدام namedtuple عندما تحتاج إلى قابلية التغيير/methods. __slots__ هي تحسين أداء موجه يقلل الذاكرة بشكل ملموس ويسرع الوصول للخصائص عندما تنشئ عدداً ضخماً من objects.
معرفة كليهما - @dataclass لنمذجة البيانات اليومية النظيفة و __slots__ (والآن يمكن دمجها عبر slots=True) للمسارات الحارة الحرجة من حيث الذاكرة - يعكس أفضل الممارسات الحالية لكتابة فئات Python فعالة وسهلة الصيانة.