الدرس 5 من 10
أصناف البيانات
- 13 دقيقة
- 6 فحوص
- 3 تلميحات
- إلى المطلوب
هدف الدرس
اكتب الحقول ودع Python تكتب الباقي
الشرح
أغلب الأصناف تحمل بيانات فقط، فتنسخ __init__ فيها المُعامِلات إلى self، ثم تكرّر __repr__ و__eq__ الحقول نفسها، وإذا أضفت حقلًا ونسيت تحديث __eq__ وقع خطأ لا ينبّهك إليه شيء.
أما @dataclass فيكتب هذه الدوال بدلًا منك اعتمادًا على الحقول التي تكتبها مع أنواعها، فتكتب done: bool = False ليصير مُعامِلًا بقيمة افتراضية، وتحصل على repr يعرض الحقول وعلى مقارنة بالقيم دون أي سطر إضافي. وfrozen=True يمنع تعديل الكائن بعد إنشائه، ويجعله صالحًا للمجموعات ولمفاتيح القواميس.
وهو يحميك من فخّ قديم يخصّ القيم الافتراضية القابلة للتعديل، فالقائمة في tags=[] داخل __init__ تُنشأ مرّة واحدة عند تعريف الدالة، فتتشاركها كل الكائنات. لذلك يرفضها @dataclass، والبديل هو field(default_factory=list) الذي يصنع قائمة جديدة لكل كائن.
المطلوب
حوّل Task إلى dataclass فيه الحقول title وdone (قيمته الافتراضية False) وtags (قائمة جديدة لكل مهمّة)، وحوّل Tag إلى dataclass مجمَّد لا يُعدَّل، فيه الحقلان name وcolor (قيمته الافتراضية "رمادي").
الفحوص
6 فحوص- المهمّة الجديدة بقيمها الافتراضية
- لكل مهمّة قائمة وسوم مستقلّة
- ناتج repr التلقائي يعرض الحقول
- المقارنة بالقيم
- كائن Tag لا يُعدَّل بعد إنشائه
- كائن Tag يصلح عنصرًا في مجموعة