يعد الوراثة مفيدًا، ولكن يمكنك فتح إمكاناته الكاملة عن طريق إعادة استخدام التعليمات البرمجية من الفئات الأساسية.

الماخذ الرئيسية

  • تتيح لك وظيفة super()‎ في Python استدعاء أساليب الطبقة الفائقة من فئة فرعية، مما يسهل تنفيذ الوراثة وتجاوز الطريقة.
  • ترتبط الدالة super() ارتباطًا وثيقًا بأمر دقة الطريقة (MRO) في بايثون، والذي يحدد الترتيب الذي يتم به البحث عن الفئات السلفية عن الأساليب أو السمات.
  • يعد استخدام super() في منشئي الفصل ممارسة شائعة لتهيئة السمات الشائعة في الفصل الأصلي وسمات أكثر تحديدًا في الفصل الفرعي. يمكن أن يؤدي الفشل في استخدام super() إلى عواقب غير مقصودة، مثل فقدان عمليات تهيئة السمة.

إحدى الميزات الأساسية لـ Python هي نموذج OOP الخاص بها، والذي يمكنك استخدامه لنمذجة كيانات العالم الحقيقي وعلاقاتها.

عند العمل مع فئات بايثون، ستستخدم غالبًا الوراثة وتتجاوز سمات أو أساليب الطبقة الفائقة. توفر بايثون أ ممتاز() وظيفة تتيح لك استدعاء أساليب الفئة الفائقة من الفئة الفرعية.

ما هو super() ولماذا تحتاجه؟

باستخدام الوراثة، يمكنك إنشاء فئة بايثون جديدة ترث ميزات فئة موجودة. يمكنك أيضًا تجاوز أساليب الفئة الفائقة في الفئة الفرعية، مما يوفر تطبيقات بديلة. ومع ذلك، قد ترغب في استخدام الوظيفة الجديدة بالإضافة إلى الوظيفة القديمة، بدلاً من استخدامها. في هذه الحالة،

instagram viewer
ممتاز() مفيد.

يمكنك استخدام ال ممتاز() وظيفة للوصول إلى سمات الطبقة الفائقة واستدعاء أساليب الطبقة الفائقة. السوبر ضروري ل البرمجة الشيئية لأنه يسهل تنفيذ الميراث وتجاوز الطريقة.

كيف يعمل السوبر ()؟

داخليا، ممتاز() يرتبط ارتباطًا وثيقًا بـ ترتيب حل الطريقة (MRO) في بايثون، والتي تحددها خوارزمية الخطية C3.

إليك الطريقة ممتاز() يعمل:

  1. تحديد الفئة الحالية والمثيل: عندما تتصل ممتاز() داخل طريقة فئة فرعية، تكتشف بايثون تلقائيًا الفئة الحالية (الفئة التي تحتوي على الطريقة التي تستدعي ممتاز()) ومثيل تلك الفئة (أي، الذات).
  2. تحديد الطبقة الفائقة: ممتاز() يأخذ وسيطتين - الفئة الحالية والمثيل - والتي لا تحتاج إلى تمريرها بشكل صريح. ويستخدم هذه المعلومات لتحديد الفئة الفائقة لتفويض استدعاء الأسلوب. يقوم بذلك عن طريق فحص التسلسل الهرمي للفئة وMRO.
  3. استدعاء الأسلوب على Superclass: بمجرد تحديد الطبقة الفائقة، ممتاز() يسمح لك باستدعاء أساليبه كما لو كنت تتصل بها مباشرة من الفئة الفرعية. يمكّنك هذا من توسيع الأساليب أو تجاوزها مع الاستمرار في استخدام التطبيق الأصلي من الفئة الفائقة.

استخدام super() في مُنشئ الفصل

استخدام ممتاز() يعد منشئ الفصل ممارسة شائعة، نظرًا لأنك ستحتاج غالبًا إلى تهيئة السمات الشائعة في الفصل الأصلي وخصائص أكثر تحديدًا في الفصل الفرعي.

ولإثبات ذلك، تحديد فئة بايثون, أب، الذي أ ابن يرث الصف من:

classFather:
def__init__(self, first_name, last_name):
self.first_name = first_name
self.last_name = last_name

classSon(Father):
def__init__(self, first_name, last_name, age, hobby):
# Call the parent class constructor (Father)
super().__init__(first_name, last_name)

self.age = age
self.hobby = hobby

defget_info(self):
returnf"Son's Name: {self.first_name}{self.last_name}, \
Son's Age: {self.age}, Son's Hobby: {self.hobby}"

# Create an instance of the Son class
son = Son("Pius", "Effiong", 25, "Playing Guitar")

# Access attributes
print(son.get_info())

داخل ابن منشئ، الدعوة إلى سوبر ().init () يستدعي أب منشئ الفصل ويمرره الاسم الأول و اسم العائلة كمعلمات. وهذا يضمن أن أب لا يزال بإمكان الفئة تعيين سمات الاسم بشكل صحيح، حتى على ملف ابن هدف.

إذا لم تتصل ممتاز() في مُنشئ الفصل، لن يتم تشغيل مُنشئ الفصل الأصلي الخاص به. يمكن أن يؤدي هذا إلى عواقب غير مقصودة، مثل فقدان عمليات تهيئة السمة أو الإعداد غير الكامل لحالة الفئة الأصل:

...
classSon(Father):
def__init__(self, first_name, last_name, age, hobby):
self.age = age
self.hobby = hobby
...

إذا حاولت الآن الاتصال بـ يحصل على معلومات الطريقة، فإنه سيتم رفع خطأ في السمة بسبب ال self.first_name و self.last_name لم تتم تهيئة السمات.

استخدام super() في أساليب الفصل

يمكنك استخدام ممتاز() بطرق أخرى، بصرف النظر عن المنشئين، بنفس الطريقة. يتيح لك هذا توسيع أو تجاوز سلوك طريقة الطبقة الفائقة.

classFather:
defspeak(self):
return"Hello from Father"

classSon(Father):
defspeak(self):
# Call the parent class's speak method using super()
parent_greeting = super().speak()
returnf"Hello from Son\n{parent_greeting}"

# Create an instance of the Son class
son = Son()

# Call the speak method of the Son class
son_greeting = son.speak()

print(son_greeting)

ال ابن الطبقة ترث من أب ولها يتكلم طريقة. ال يتكلم طريقة ابن استخدامات الطبقة سوبر (). التحدث () للاتصال ب يتكلم طريقة أب فصل. وهذا يسمح لها بتضمين الرسالة من الفصل الأصلي أثناء توسيعها برسالة خاصة بالفئة الفرعية.

فشل في الاستخدام ممتاز() في طريقة تتجاوز طريقة أخرى، فإن الوظيفة الموجودة في طريقة الفئة الأصل لن تصبح سارية المفعول. وينتج عن هذا استبدال كامل لسلوك الطريقة، مما قد يؤدي إلى سلوك لم تكن تقصده.

فهم ترتيب حل الطريقة

ترتيب تحليل الطريقة (MRO) هو الترتيب الذي تبحث به Python عن فئات الأسلاف عند الوصول إلى طريقة أو سمة. يساعد MRO بايثون في تحديد الطريقة التي سيتم الاتصال بها عند وجود تسلسلات هرمية متعددة للوراثة.

classNigeria():
defculture(self):
print("Nigeria's culture")

classAfrica():
defculture(self):
print("Africa's culture")

إليك ما يحدث عند إنشاء مثيل لـ لاغوس الصف واستدعاء ثقافة طريقة:

  1. تبدأ بايثون بالبحث عن ثقافة الطريقة في لاغوس الطبقة نفسها. إذا وجد ذلك، فإنه يستدعي الأسلوب. إذا لم يكن الأمر كذلك، فإنه ينتقل إلى الخطوة الثانية.
  2. إذا لم يتم العثور على ثقافة الطريقة في لاغوس تنظر بايثون إلى الفئات الأساسية بالترتيب الذي تظهر به في تعريف الفئة. في هذه الحالة، لاغوس يرث أولا من أفريقيا ثم من نيجيريا. لذلك، سوف تبحث بايثون عن ثقافة طريقة في أفريقيا أولاً.
  3. إذا لم يتم العثور على ثقافة الطريقة في أفريقيا فئة، ستبحث بايثون بعد ذلك في ملف نيجيريا فصل. يستمر هذا السلوك حتى يصل إلى نهاية التسلسل الهرمي ويلقي خطأ إذا لم يتمكن من العثور على الطريقة في أي من الفئات الفائقة.

يُظهر الإخراج ترتيب دقة الطريقة لـ لاغوس، بدءًا من اليسار إلى اليمين.

المخاطر الشائعة وأفضل الممارسات

عند العمل مع ممتاز()، هناك بعض المخاطر الشائعة التي يجب تجنبها.

  1. انتبه إلى ترتيب تحليل الطريقة، خاصة في سيناريوهات الوراثة المتعددة. إذا كنت بحاجة إلى استخدام الميراث المتعدد المعقد، فيجب أن تكون على دراية بـ خوارزمية الخطية C3 التي تستخدمها بايثون لتحديد MRO.
  2. تجنب التبعيات الدائرية في التسلسل الهرمي لفصلك، مما قد يؤدي إلى سلوك غير متوقع.
  3. توثيق التعليمات البرمجية الخاصة بك بوضوح، وخاصة عند الاستخدام ممتاز() في التسلسلات الهرمية المعقدة للفئات، لجعلها أكثر قابلية للفهم للمطورين الآخرين.

استخدم super() بالطريقة الصحيحة

بايثون ممتاز() تعتبر الوظيفة ميزة قوية عند العمل مع الوراثة وتجاوز الطريقة. فهم كيف ممتاز() ستتيح لك الأعمال واتباع أفضل الممارسات إنشاء تعليمات برمجية أكثر قابلية للصيانة وفعالة في مشاريع Python الخاصة بك.