أساليب dunder الخاصة
Special (Dunder) Methods
أساليب dunder الخاصة — Special (Dunder) Methods
عندما تكتب len([1, 2, 3]) أو "a" + "b" أو print(obj) — Python في الحقيقة تستدعي أساليب خاصة في الخلفية. هذه الأساليب تُسمى dunder methods (اختصار Double Underscore) لأن اسمها يبدأ وينتهي بشرطتين سفليتين مزدوجتين: __str__, __add__, __eq__.
يمكنك تعريف هذه الأساليب في كلاساتك لتجعل كائناتك تستجيب لعمليات Python القياسية مثل الطباعة والمقارنة والجمع والتكرار.
لماذا dunder Methods؟
nums = [10, 20, 30]
print(len(nums)) # يستدعي nums.__len__()
print(nums[0]) # يستدعي nums.__getitem__(0)
nums2 = nums + [40] # يستدعي nums.__add__([40])
عندما تكتب كلاساً خاصاً بك وتريد أن يتصرف بشكل طبيعي مع هذه العمليات، تحتاج لتطبيق الأساليب المقابلة.
__str__ و__repr__
الفرق: __str__ للعرض للمستخدم، __repr__ للمطوّر والتصحيح.
متى تستخدم أيهما؟
__str__: لما يظهر للمستخدم — رسالة واضحة وجميلة.__repr__: لما تريده في السجلات والتصحيح — دقيق ومحدد، يُفضَّل أن يكون valid Python يمكن تنفيذه لإعادة إنشاء الكائن.- إذا لم تُعرّف
__str__، يرجع Python لـ__repr__. لذا ابدأ دائماً بـ__repr__إذا كانت الأولوية للتصحيح.
__eq__ — المقارنة بالمساواة
بدون __eq__، مقارنة كائنين دائماً False حتى لو حقولهما متطابقة (لأن Python يقارن الهوية في الذاكرة لا القيمة).
NotImplemented (ليس None) قيمة خاصة تخبر Python أن هذه الكلاس لا تعرف كيف تقارن بالنوع الآخر، فيحاول Python الجهة الأخرى.
__len__ — طول الكائن
بمجرد تعريف __len__، يعمل bool() تلقائياً: الكائن True إذا كان طوله أكبر من صفر، وFalse إذا كان صفراً.
__add__ — عامل الجمع
__rmul__ يُستدعى عندما Python لا يعرف كيف يُنجز 3 * v1 من جهة العدد — يجرب الجانب الأيمن بدلاً من ذلك.
__iter__ — جعل الكائن قابلاً للتكرار
yield داخل __iter__ يُحوّله إلى generator تلقائياً — أبسط من كتابة __iter__ و__next__ منفصلَين.
جمع dunder Methods في كلاس واحد
جدول مرجعي سريع
| أسلوب dunder | متى يُستدعى | مثال |
|---|---|---|
__str__ | print(obj), str(obj) | عرض لطيف للمستخدم |
__repr__ | repr(obj), في القوائم | تمثيل تقني دقيق |
__eq__ | obj1 == obj2 | مقارنة بالقيمة |
__len__ | len(obj), bool(obj) | حجم/طول الكائن |
__add__ | obj1 + obj2 | عملية الجمع |
__mul__ | obj * n | عملية الضرب |
__iter__ | for x in obj, list(obj) | التكرار |
__contains__ | item in obj | اختبار الاحتواء |
__getitem__ | obj[key] | الفهرسة |