تكرار السؤال: …
الإجابة المختصرة
تحدد __slots__ قائمة ثابتة من الـ attributes وتلغي __dict__ لكل instance، مما يقلل الذاكرة ويسرّع الوصول قليلًا، لكنها تمنع إضافة attributes ديناميكية وتعقّد الوراثة.
الشرح
الفائدة تظهر عند إنشاء ملايين الكائنات الصغيرة. التنازلات: لا يمكن إضافة attributes غير معلنة، ولا weak references إلا بإضافة __weakref__، ويجب أن تعرّف كل subclass الـ __slots__ الخاصة بها وإلا عاد __dict__. كما قد تتعارض مع وراثة متعددة من classes لها slots غير فارغة، ومع بعض أدوات الـ serialization. قِس الذاكرة باستخدام tracemalloc قبل اعتمادها على نطاق واسع.
مثال بالكود
class Point:
__slots__ = ("x", "y")
def __init__(self, x: float, y: float):
self.x = x
self.y = y
p = Point(1, 2)
p.z = 3 # AttributeError: 'Point' object has no attribute 'z'أخطاء شائعة
- إضافة __slots__ لكل class بدون قياس فعلي للذاكرة.
- نسيان تعريف __slots__ في الـ subclass فيعود __dict__ وتضيع الفائدة.