في هذا البرنامج التعليمي، سوف نتعرف على ترتيب دقة الطريقة، والذي يُعرف أيضًا باسم MRO. إنه مفهوم أساسي لميراث بايثون.
يصف ترتيب دقة الطريقة مسار البحث للفئة التي بايثون يستخدم للحصول على الطريقة المناسبة في الفئات التي تحتوي على الميراث المتعدد.
مقدمة
كما نعلم، تسمى الفئة الموروثة بالفئة الفرعية أو الفئة الأصل، في حين تُعرف الفئة التي ترث بالفئة الفرعية أو الفئة الفرعية. في الميراث المتعدد، يمكن أن تتكون الفئة من العديد من الوظائف، لذلك يتم استخدام تقنية ترتيب دقة الطريقة للبحث عن الترتيب الذي يتم به تنفيذ الفئة الأساسية.
بكلمات بسيطة - 'يتم استكشاف الطريقة أو السمات في الفصل الحالي، وإذا لم تكن الطريقة موجودة في الفصل الحالي، فسينتقل البحث إلى الفئات الأصلية، وهكذا'. هذا مثال على بحث العمق أولاً.
إنها تلعب دورًا أساسيًا في الميراث المتعدد حيث يمكن العثور على نفس الطريقة في الفئات الفائقة المتعددة.
لفهمها بطريقة أفضل، دعونا نرى كيف يمكننا استخدامها.
مثال -
class A: def myname(self): print('I am a class A') class B(A): def myname(self): print('I am a class B') class C(A): def myname(self): print('I am a class C') c = C() print(c.myname())
انتاج:
يساوي CPP
I am a class C
توضيح -
هناك وراثة متعددة في الكود أعلاه. لقد حددنا ثلاث فئات تسمى A وB وC، وهذه الفئات لها نفس طريقة الاسم التي تسمى اسمي(). لقد أنشأنا فئة كائن C. استدعى الكائن الفئة C، وليس الفئة، بينما ورثت الفئة C طريقة الفئة A.
يتم اتباع الترتيب في الكود أعلاه الفئة ب -> الفئة أ. تُعرف هذه التقنية باسم MRO (ترتيب دقة الطريقة).
تحويل السلسلة إلى interger
دعونا نفهم مثالا آخر على الميراث المتعدد.
مثال -
class A: def myname(self): print(' I am a class A') class B(A): def myname(self): print(' I am a class B') class C(A): def myname(self): print('I am a class C') # classes ordering class D(B, C): pass d = D() d.myname()
انتاج:
I am a class B
توضيح -
في الكود أعلاه، قمنا بإنشاء فئة D أخرى دون تحديد سمات الفئة التي ورثت الفئة B وC. عندما قمنا باستدعاء الطريقة اسمي()، يذهب إلى الفئة D ويبحث عن اسمي( ) وظيفة. لكن الفئة D ليس لديها أي إعلان. وبالتالي، ينتقل البحث إلى الفئة ب، ويحصل على اسمي() الدالة، وإرجاع النتيجة. سيتم البحث على النحو التالي.
Class D -> Class B -> Class C -> Class A
إذا لم يكن لدى الفئة B طريقة، فسوف تستدعي طريقة الفئة C.
نقترح عليك هنا إزالة طريقة الفئة B والتحقق مما يحدث. من خلال القيام بذلك، سوف تحصل على فكرة عن كيفية عمل حل الأسلوب.
ترتيب النمط القديم والجديد
في الإصدار الأقدم من بايثون (2.1)، يقتصر استخدامنا للفئات القديمة ولكن بايثون (2.2 ومتابعة)، يمكننا استخدام الفئات الجديدة. بشكل افتراضي، يحتوي Python 3 على فئات أصلية (جديدة). يرث الأصل الأول لفئة النمط الجديد من فئة 'الكائن' جذر بايثون. دعونا نرى المثال التالي -
مثال -
# Old style class class OldStyleClass: pass # New style class class NewStyleClass(object): pass
يختلف أسلوب الإعلان لكلا الفئتين. في دقة الطريقة، تتبع فئات النمط القديم خوارزمية العمق من اليسار إلى اليمين (DLR)، بينما تستخدم فئات النمط الجديد خوارزمية C3 الخطية أثناء إجراء الميراث المتعدد.
خوارزمية DLR
تقوم Python بإنشاء قائمة بالفئات أثناء تنفيذ الميراث المتعدد بين الفئات. يتم استخدام هذه القائمة لتحديد الطريقة التي يجب استدعاؤها بواسطة المثيلات.
المصفوفات جافا
يمكننا أن نفترض أن العمل باسمه لأن دقة الطريقة ستبحث في العمق أولاً، ثم تنتقل من اليسار إلى اليمين. أدناه هو المثال.
مثال -
class A: pass class B: pass class C(A, B): pass class D(B, A): pass class E(C,D): pass
أولاً، ستبحث الخوارزمية في فئة المثيل عن الطريقة التي تم استدعاؤها. إذا لم يتم العثور عليه، فإنه يذهب إلى الآباء الأولين، إذا لم يتم العثور عليه أيضًا. وسوف ننظر في والد الوالد. وسيستمر هذا حتى نهاية وراثة الطبقات.
في المثال أعلاه، سيكون ترتيب دقة الطريقة -
class D -> class B -> class A -> class C -> class A
لكن، A لا يمكن أن يكون حاضرًا مرتين، لذلك -
class D -> class B -> class A -> class C ->
تُظهر هذه الخوارزمية السلوك الغريب في ذلك الوقت. دعونا نرى المثال أدناه.
مثال -
class A: pass class B: pass class C(A, B): pass class D(B, A): pass class E(C,D): pass
وفقًا لخوارزمية DLR، سيكون الترتيب هو E، C، D، B، A. هناك تبادل للفئات A & B في الفئة C، وهو أمر غامض للغاية. وهذا يعني أن الخوارزمية لا تحافظ على خاصية الرتابة.
كان صامويل بيردوني أول شخص اكتشف عدم الاتساق بين خوارزميات MRO.
خوارزمية الخطية C3
تعد خوارزمية الخطية C3 إصدارًا أفضل من خوارزمية DLR لأنها تزيل عدم الاتساق. تحتوي هذه الخوارزمية على بعض القيود الموضحة أدناه.
- يجب أن يسبق الأطفال والديهم.
- إذا ورثت فئة معينة من فئة واحدة أو أكثر، فسيتم حفظها بالترتيب المحدد في صف الفئة الأساسية.
قواعد خوارزمية الخطية C3
- يتم تحديد هيكل ترتيب دقة الطريقة من خلال الرسم البياني للميراث.
- يجب على المستخدم زيارة الفئة الفائقة فقط بعد زيارة طرق الفئات المحلية.
- الحفاظ على الرتابة
طريقة لفئة حل الطريقة
توفر Python طريقتين للحصول على ترتيب دقة الطريقة للفئة - __مرو__ صفة أو مرو () طريقة. وبمساعدة هذه الطرق، يمكننا عرض ترتيب الطريقة التي يتم بها حلها.
دعونا نفهم المثال التالي.
مثال -
class A: def myname(self): print(' I am a class A') class B(A): def myname(self): print(' I am a class B') class C(A): def myname(self): print('I am a class C') # classes ordering class D(B, C): pass # it prints the lookup order print(D.__mro__) print(C.mro())
انتاج:
نوع التاريخ المكتوب
(, , , , ) [, , ]
كما نرى في الناتج أعلاه، نحصل على ترتيب دقة الطريقة. بهذه الطريقة، تعمل خوارزمية الخطية C3 للميراث المتعدد.