Menu
Coddy logo textTech
flag Ar iconالعربيةdown icon

مقدمة في الأساليب السحرية

جزء من قسم Object Oriented Programming في رحلة Python على Coddy — الدرس 33 من 64.

الطرق السحرية (تُسمى أيضاً طرق dunder) هي طرق خاصة تحتوي على شرطات سفلية مزدوجة في البداية والنهاية. يقوم Python باستدعائها تلقائياً استجابةً لعمليات معينة.

إليك مثال على فئة (class) تحتوي على دوال سحرية (magic methods):

class Book:
    def __init__(self, title, author, pages):
        self.title = title
        self.author = author
        self.pages = pages
    
    def __str__(self):
        return f"{self.title} by {self.author}"

يتم استدعاء الطريقة __init__ تلقائياً عند إنشاء كائن:

my_book = Book("Python Programming", "John Smith", 350)

يتم استدعاء التابع __str__ تلقائياً عند تحويل الكائن إلى سلسلة نصية:

print(my_book)        # يتم استدعاء __str__ تلقائياً
print(str(my_book))   # يستدعي أيضاً __str__

المخرجات:

Python Programming by John Smith
Python Programming by John Smith

بدون __str__، ستعرض عملية الطباعة موقع الكائن في الذاكرة:

class SimpleBook:
    def __init__(self, title):
        self.title = title

simple = SimpleBook("Test Book")
print(simple)  # <__main__.SimpleBook object at 0x...>

أضف دالة سحرية (magic method) أخرى للطول:

class Book:
    def __init__(self, title, author, pages):
        self.title = title
        self.author = author
        self.pages = pages
    
    def __str__(self):
        return f"{self.title} by {self.author}"
    
    def __len__(self):
        return self.pages

my_book = Book("Python Programming", "John Smith", 350)
print(len(my_book))   # يستدعي __len__ تلقائياً

الناتج:

350

نقطة رئيسية: تبدأ الأساليب السحرية (Magic methods) وتنتهي بشرطات سفلية مزدوجة (__method__) ويتم استدعاؤها تلقائيًا بواسطة Python. وهي تسمح للكائنات الخاصة بك بالعمل مع الدوال المدمجة مثل str() و len() والعمليات، مما يجعل فئاتك (classes) أكثر توافقًا مع أسلوب بايثون (Pythonic) وسهلة الاستخدام.

challenge icon

التحدي

سهل

في هذا التحدي، ستقوم بتنفيذ فئة Counter باستخدام الطرق السحرية (magic methods).

  • counter.py - هذا هو الملف الذي تحتاج إلى تعديله، ويحتوي على تعليقات TODO لتوجيهك في التنفيذ
  • driver.py - يحتوي على حالات اختبار شاملة

قم بتنفيذ فئة Counter في counter.py وحالات الاختبار في driver.py باتباع تعليقات TODO. يجب أن تدعم الفئة التهيئة بقيم اختيارية، والتمثيل النصي، وعمليات الجمع.

ورقة مرجعية

الطرق السحرية (طرق dunder) هي طرق خاصة تحتوي على شرطات سفلية مزدوجة يستدعيها بايثون تلقائيًا استجابةً لعمليات معينة.

الطرق السحرية الشائعة:

  • __init__ - يتم استدعاؤها عند إنشاء كائن
  • __str__ - يتم استدعاؤها عند التحويل إلى سلسلة نصية باستخدام str() أو print()
  • __len__ - يتم استدعاؤها عند استخدام دالة len()
class Book:
    def __init__(self, title, author, pages):
        self.title = title
        self.author = author
        self.pages = pages
    
    def __str__(self):
        return f"{self.title} by {self.author}"
    
    def __len__(self):
        return self.pages

my_book = Book("Python Programming", "John Smith", 350)
print(my_book)        # يتم استدعاء __str__ تلقائيًا
print(len(my_book))   # يتم استدعاء __len__ تلقائيًا

بدون __str__، تظهر الطباعة موقع الكائن في الذاكرة بدلاً من تنسيق قابل للقراءة.

جرّب بنفسك

# TODO: استيراد فئة Counter من counter.py
# استخدم التنسيق: from counter import Counter

# معالج حالات الاختبار الشامل
test_case = input()

if test_case == "init_test":
    # TODO: اختبار التهيئة بالقيمة الافتراضية
    # إنشاء عداد بدون وسائط وطباعته
    # المخرجات المتوقعة: "Count: 0"
    pass

elif test_case == "init_with_value":
    # TODO: اختبار التهيئة بقيمة محددة
    # إنشاء عداد بقيمة أولية 10 وطباعته
    # ملاحظة: print() تستدعي __str__ بشكل ضمني، لكن تركيزنا هنا هو اختبار __init__
    # المخرجات المتوقعة: "Count: 10"
    pass


elif test_case == "addition":
    # TODO: اختبار عملية الجمع
    # إنشاء عداد بقيمة 3، وإضافة 7 إليه، وطباعة النتيجة
    # المخرجات المتوقعة: "Count: 10"
    pass

elif test_case == "chained_addition":
    # TODO: اختبار عمليات الجمع المتسلسلة
    # إنشاء عداد بقيمة 1، وإضافة 2، ثم إضافة 3 إلى النتيجة، والطباعة
    # المخرجات المتوقعة: "Count: 6"
    pass

elif test_case == "negative_values":
    # TODO: الاختبار بالقيم السالبة
    # إنشاء عداد بقيمة -5 وطباعته
    # ثم إضافة -3 إليه وطباعة النتيجة
    # المخرجات المتوقعة: "Count: -5" و "Count: -8"
    pass

elif test_case == "zero_value":
    # TODO: الاختبار بقيم صفرية
    # إنشاء عداد بقيمة 0، وإضافة 0، والطباعة
    # المخرجات المتوقعة: "Count: 0"
    pass

elif test_case == "large_values":
    # TODO: الاختبار بقيم كبيرة
    # إنشاء عداد بقيمة 1000000 وإضافة 9000000
    # المخرجات المتوقعة: "Count: 10000000"
    pass

elif test_case == "multiple_counters":
    # TODO: اختبار التفاعل بين عدادات متعددة
    # إنشاء counter1 بقيمة 5 و counter2 بقيمة 10
    # طباعة كلا العدادين
    # المخرجات المتوقعة: "Count: 5" و "Count: 10"
    pass

elif test_case == "type_validation":
    # TODO: اختبار إضافة أنواع مختلفة
    # محاولة إضافة عدد عشري (2.5) إلى عداد بقيمة 5
    # المخرجات المتوقعة: "Count: 7.5"
    pass
quiz iconاختبر نفسك

يتضمن هذا الدرس اختبارًا قصيرًا. ابدأ الدرس للإجابة عليه وتتبّع تقدمك.

جميع دروس Object Oriented Programming