الدرس 3 من 10
متى يتساوى كائنان
- 13 دقيقة
- 6 معايير للتصحيح
- 3 تلميحات
- إلى المطلوب
هدف الدرس
مفتاح في قاموس وعنصر في مجموعة
الشرح
بلا تعريف منك، يسأل == بين كائنين «هل هما الكائن نفسه؟» لا «هل يحملان القيم نفسها؟». لذلك تعطي Point(1, 2) == Point(1, 2) القيمة False، وتمتلئ مجموعة النقاط التي زرتها بالمكرّر.
__eq__ يعرّف المساواة بالقيمة. وحين يكون الطرف الآخر من نوع لا تعرفه أرجِع NotImplemented لا False، فتعطي بايثون الطرف الآخر فرصته قبل أن تحكم.
والفخّ الشائع: تعريف __eq__ وحده يُلغي __hash__، فلا يعود الكائن يصلح عنصرًا في مجموعة ولا مفتاحًا في قاموس، وترى TypeError: unhashable type. والقاعدة أن المتساويين لهما hash واحد، فابنِه من الحقول نفسها التي تقارن بها. ولا تغيّر هذه الحقول بعد أن يدخل الكائن مجموعة، وإلا ضاع فيها.
المطلوب
أضف إلى Point دالة __eq__ تقارن x وy وتُرجع NotImplemented لغير النقاط، ودالة __hash__ متّسقة معها.
معايير التصحيح
6 معايير- نقطتان بالإحداثيات نفسها متساويتان
- والمختلفتان غير متساويتين
- المقارنة بنوع آخر تعطي False ولا ترمي
- المتساويتان لهما hash واحد
- تصلح مفتاحًا في قاموس
- المجموعة تُسقط المكرّر