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

ترتيب استدعاء الدوال (Method Resolution Order)

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

ترتيب حل الأساليب (Method Resolution Order - MRO) هو التسلسل الذي يستخدمه Python للبحث عن الأساليب عندما تمتلك فئات متعددة نفس اسم الأسلوب.

إليك مثال على فئات متعددة تمتلك نفس الدالة (method):

class A:
    def method(self):
        return "Method from A"

class B:
    def method(self):
        return "Method from B"

class C(A, B):
    pass

تحقق من الـ MRO باستخدام __mro__:

print(C.__mro__)

الناتج:

(<class '__main__.C'>, <class '__main__.A'>, <class '__main__.B'>, <class 'object'>)

السمة __mro__ هي عبارة عن صف (tuple) يحتوي على جميع الفئات في ترتيب الحل (resolution order). العنصر الأول (__mro__[0]) هو دائماً الفئة نفسها (C)، تليها الفئات الأب من اليسار إلى اليمين (A، ثم B)، وأخيراً فئة الكائن (object) المضمنة.

أنشئ كائناً واستدعِ الطريقة:

c = C()
print(c.method())

المخرجات:

Method from A

وجد Python الـ method في class A أولاً (في index 1 في الـ MRO)، لذا استخدمها.

قم بتغيير ترتيب الوراثة لرؤية الفرق:

class D(B, A):  # تأتي B قبل A الآن
    pass

print(D.__mro__)
d = D()
print(d.method())

الناتج:

(<class '__main__.D'>, <class '__main__.B'>, <class '__main__.A'>, <class 'object'>)
Method from B

الآن يجد Python طريقة B أولاً لأن B تأتي قبل A في قائمة الوراثة. يمكنك الوصول إلى فئات محددة في MRO باستخدام الفهرسة - D.__mro__[0] هي D نفسها، D.__mro__[1] هي B، و D.__mro__[2] هي A.

يمكنك أيضاً استخدام طريقة mro():

print(C.mro())

هذا يعطي نفس نتيجة __mro__ ولكن كقائمة.

نقطة رئيسية: يبحث Python عن الطرق (methods) بترتيب MRO - الفئة (class) نفسها أولاً (index 0)، ثم الفئات الأب (parent classes) من اليسار إلى اليمين كما هي مدرجة في تعريف الفئة (indices 1, 2, إلخ). يتم استخدام أول طريقة يتم العثور عليها.

challenge icon

التحدي

متوسط

في هذا التحدي، ستقوم بتنفيذ هيكلية فئات (class hierarchy).

ستحتاج إلى تعديل هذه الملفات:

  • device.py: قم بتنفيذ فئة Device الأساسية
  • screen.py: قم بتنفيذ فئة Screen التي ترث من Device
  • computer.py: قم بتنفيذ فئة Computer التي ترث من Device
  • laptop.py: قم بتنفيذ فئة Laptop مع وراثة متعددة
  • driver.py - قم بتنفيذ حالات اختبار للتحقق من أن تنفيذك يعمل بشكل صحيح

يحتوي كل ملف على تعليقات TODO مفصلة سترشدك خطوة بخطوة خلال التنفيذ.

ورقة مرجعية

ترتيب حل الأساليب (Method Resolution Order - MRO) هو التسلسل الذي يستخدمه بايثون للبحث عن الأساليب (methods) عندما تمتلك فئات (classes) متعددة نفس اسم الأسلوب.

تحقق من MRO باستخدام __mro__ أو mro():

class A:
    def method(self):
        return "Method from A"

class B:
    def method(self):
        return "Method from B"

class C(A, B):
    pass

print(C.__mro__)
print(C.mro())  # نفس النتيجة كقائمة

يبحث بايثون عن الأساليب بترتيب MRO - الفئة نفسها أولاً، ثم الفئات الأب من اليسار إلى اليمين كما هو مدرج في تعريف الفئة:

c = C()
print(c.method())  # "Method from A" - A تأتي قبل B

class D(B, A):  # B تأتي قبل A الآن
    pass

d = D()
print(d.method())  # "Method from B" - B تأتي قبل A

جرّب بنفسك

# TODO: استيراد جميع الفئات المطلوبة
# from device import Device
# from screen import Screen
# from computer import Computer
# from laptop import Laptop

def explain_mro(class_name):
    # TODO: طباعة MRO (ترتيب دقة الطريقة) للفئة المعطاة
    # TODO: التنسيق: "MRO for [class name]:" (ملاحظة: لا توجد مسافة بعد النقطتين)
    # TODO: استخدم class_name.__name__ للحصول على اسم الفئة
    # TODO: استخدم class_name.__mro__ للحصول على صف (tuple) الـ MRO
    # TODO: طباعة اسم كل فئة في الـ MRO على أسطر منفصلة
    
    # TODO: إنشاء مثيل (instance) من الفئة
    # TODO: استدعاء power_on() على المثيل وتخزين النتيجة
    # TODO: طباعة: "Power on result: [result]"
    # TODO: طباعة سطر فارغ لتحسين القراءة
    pass


# اختبر الكود الخاص بك
# TODO: استدعاء explain_mro() مع كل فئة: Device، و Screen، و Computer، و Laptop
quiz iconاختبر نفسك

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

جميع دروس Object Oriented Programming