دعنا نتحدث عن شيء يبدو معقدًا للغاية.
يطلق عليه MRO أو ترتيب قرار الأسلوب.
ماذا يعني ذلك؟
حسنًا ، لدي مثال هنا من أجلك.
لنفترض أن لدينا فئة A من الفئة B التي ترث من الفئة A لا تفعل شيئًا على الإطلاق.
ثم لدينا أيضًا الفئة C التي ترث مرة أخرى من A ثم أخيرًا الفئة D
، ثم ترث من B و C.
لذلك لدينا فئتان لا تفعل شيئًا على الإطلاق ، ثم فئة A و C لها نفس
سمة كائن الفئة.
وقد قمت بالفعل برسم كيف تبدو هذه العلاقة.
ترى أن D لها ميراث متعدد من B و C و B و C يرثون من A.
و Amro أو أمر حل الطريقة هو قاعدة تتبعها Python لتحديد متى تقوم بتشغيل طريقة أي طريقة يتم تشغيلها عندما
يكون لديك مثل هذا الهيكل الوراثي المعقد.
عمرو هي قاعدة تقول ، مرحبًا ، افعل هذا ، افعل هذا ، ثم افعل ذلك.
وهذه هي الطريقة التي يجب أن تديرها.
اسمحوا لي أن أريكم ما أعنيه.
لنفترض أنني أردت طباعة dx dot num.
ما رأيك سيحدث هنا؟
اسمحوا لي أن أبعد هذا عن الطريق أو التعليق على ذلك.
إذا قمت بتشغيل هذا ، هل يمكنك تخمين ما سيحدث؟
إذا قمت بالنقر فوق تشغيل.
أحصل على واحد؟
هل هذا ما توقعته؟
دعونا ننظر من خلال هذا.
يرث DD من B و C.
ومن ثم يرثون مني.
لذلك نحصل على واحد لأن MRO ، ترتيب قرار الطريقة هو أنه لا يذهب D ، b ، a.
بدلا من ذلك يذهب د.
ب.
ج.
أ.
همم.
دعونا نفكر في هذا قليلا.
وميرو يقول ببساطة ما هو الأول في السطر إذا كانت الأشياء مشتركة بين الفئات أو الطرق أو المتغيرات أو
السمات؟
ماذا علي أن أختار؟
وهناك بالفعل طريقة جيدة للتحقق من ذلك إذا قمت بذلك ، يا ميرو ، ثم قم بتشغيله على هذا النحو.
تشغيل بحيرة وهمية.
انظر إلى ذلك.
هذا هو ترتيب أو مارو من هذه الفئة.
تقول ، مرحبًا ، سأفحص D أولاً.
إذا اتصلت ، فلنفترض Dot name أو dot num.
سأقوم بفحص النقطة الرئيسية D أولاً.
سأقوم بفحص هذا الفصل ، ثم سأقوم بفحص النقطة B الرئيسية ، لذا سأقوم بفحص النقطة
B ثم سأقوم بفحص النقطة C.
ثم سأقوم بفحص أ.
وأخيرًا ، سأفحص كائن الفئة الأساسية مرة أخرى.
لقد رأينا ذلك من قبل.
إنها الفئة الأساسية التي ترث منها جميع الكائنات في بايثون.
هذا هو الترتيب الذي يتحقق منه.
الآن ، إذا مررنا بكل هذه.
وأنا انقر فوق تشغيل.
سأحصل على هواء.
لا يوجد لدى D أي خاصية خدر لأنها مرت بكل هذا المسار ، حتى أنها فحصت الكائن الأساسي ولم يتم العثور
على num.
إذا فعلت شيئًا مثل SW tr.
إذا قمت بالنقر فوق تشغيل.
يعمل هذا لأنه يمر عبر سلسلة الوراثة ثم يصل إلى الكائن الأساسي.
والجسم الأساسي يحتوي على هذا في الواقع ، لذا فهو لا يخطئ.
ونعم ، يمكنك استخدام سلسلة الغطس.
حاليا.
لقد وجدت مثالًا رائعًا هنا لأوضح لك لماذا قد تكون الميراث مربكة ولماذا قد ترغب
في تجنب أشياء مثل عمرو أو على الأقل تدركها.
لذلك دعونا ننسخ هذا الرمز.
ودعنا نزيل كل هذا.
وسنلعب لعبة صغيرة.
الآن هذا النحو.
يشبه هذا.
إذن هذا هو نموذج الوراثة لما أنشأناه للتو.
تبدو محيرة للغاية ، أليس كذلك؟
لذلك إذا فعلناها هنا.
ونحن نتحقق من MRO أو ترتيب قرار الطريقة لـ M.
ماذا سيكون الترتيب في رأيك؟
أوقف الفيديو هنا وحاول تخمين الترتيب.
مستعد.
لنفعل m dot amro.
وبالمناسبة ، هناك طريقة أخرى للقيام بذلك وهي استخدام dunder amro ودعنا نطبع هذا.
حسنًا ، دعنا نتحقق من هذا.
لذا فإن أول شيء لدينا هو م.
حسنا؟
نتحقق منه ، ثم نتحقق من B ، نتحقق من B ، حسنًا.
ثم نتحقق من A.
لذا نتحقق من A هنا ، ثم نتحقق من x x هنا ، ثم y.
ثم Z ، ثم كائن الفئة.
هل هذا ما خمنت؟
لنلق نظرة على الكود.
لماذا هذا الطلب؟
حسنًا ، يرجع هذا الترتيب إلى الطريقة التي نمر بها في المعلمات التي تراها يتم تمريرها
قبل A و Z.
هذا يعني أن ترتيب Maro سيكون إذن a.
لكن انتظر بعد بينا.
ماذا كان هذا؟
حسنًا ، بعد B و A ، لدينا صنف x.
لماذا جاء X قبل Z؟
لذا بدلاً من الذهاب إلى Z ، لنجعل هذا أكبر قليلاً.
بدلاً من الذهاب إلى ما كنا نظن أنه Z ، فإنه ينتقل إلى X ، ثم Y ، ثم Z ، ثم الكائن.
هذا بسبب الخوارزمية التي يستخدمونها لعمل ميرو ، والتي تسمى عمق البحث.
الآن هذا خارج نطاق الدورة ، لكن كما ترى ، إنه محير بعض الشيء.
وفي واقع الأمر ، غيرت Python بالفعل قواعد MISO مما فعلناه سابقًا في الإصدارات الأحدث
من Python.
إذن هذا واحد آخر من تلك الأشياء التي تم تحديثها.
لكن السبب في أنني أريكم هذا هو أنك لن تخضع للاختبار أبدًا على هذه الأشياء.
إذا كنت تكتب رمزًا حيث يبدو الميراث هكذا ، فأنا أزعم أنك تكتب رمزًا سيئًا
لأن هذا معقد للغاية.
لم نكتب أي رمز فعليًا داخل هذه الفئات ، وهو أمر محير بالفعل.
لذا عمرو هناك كطريقة لتحديد الترتيب الذي سترثه.
ويمكنك دائمًا استخدام وظيفة MRO أو DUNDAR للتحقق من ذلك.
لكن سبب إحضاري هنا ليس مجرد محاولة إرباكك.
السبب هو أنه موجود.
ومع ذلك ، لا يجب هيكلة الكود الخاص بك بهذه الطريقة.
هذا لا يعني أن هذا لا يحدث في البرية.
نعم إنها كذلك.
ولكن على الأقل لديك طريقة للتحقق وربما تصحيح أخطاء التعليمات البرمجية الخاصة بك عندما ترى مشكلة كهذه.
سأترك لك مصدرًا عن مارو.
إذا كنت مهتمًا حقًا وتريد حقًا فهم كيفية عمل هذه الخوارزمية وكيف يتم تحديد هذا الترتيب
بالفعل.
لكن الفكرة الأساسية هي أن هذه هي الطريقة التي تعمل بها بايثون لتحديد ، عندما
تستدعي طريقة أو سمة.
هذه هي الطريقة التي سأبحث بها عن التسلسل الهرمي للميراث.
حسنا.
إذا كان عقلك يؤلمك ، فلا تقلق.
و أنا ايضا.
خذ استراحة وسأراك في الفيديو التالي.
مع السلامة.