الوراثة المتعددة
جزء من قسم Object Oriented Programming في رحلة Python على Coddy — الدرس 20 من 64.
تسمح الوراثة المتعددة للفئة بالوراثة من أكثر من فئة أب واحدة، مما يجمع بين الوظائف من مصادر مختلفة.
إليك فئتان أساسيتان (parent classes):
class Animal:
def __init__(self, name):
self.name = name
def eat(self):
return f"{self.name} is eating"
class Flyable:
def fly(self):
return f"{self.name} is flying"أنشئ فئة فرعية ترث من كلا الأبوين:
class Bird(Animal, Flyable):
def __init__(self, name, species):
super().__init__(name) # يستدعي __init__ الخاصة بـ Animal
self.species = species
def sing(self):
return f"{self.name} is singing"الصيغة class Bird(Animal, Flyable): تعني أن Bird يرث من كل من Animal و Flyable.
أنشئ كائن طائر واستخدم الدوال (methods) من كلا الأبوين:
sparrow = Bird("Sparrow", "House sparrow")استدعاء الدوال من الفئة الأب الأولى:
print(sparrow.eat())استدعاء الدوال (methods) من الفئة الأب الثانية:
print(sparrow.fly())استدعِ الطريقة الخاصة بالطائر:
print(sparrow.sing())المخرجات:
Sparrow is eating
Sparrow is flying
Sparrow is singingيمكنك التحقق من ترتيب الوراثة:
print(Bird.__mro__) # ترتيب حل الأساليب (Method Resolution Order)يوضح هذا أي فئة أب يتم التحقق منها أولاً عند البحث عن الدوال (methods).
نقطة رئيسية: تستخدم الوراثة المتعددة صيغة class Child(Parent1, Parent2):. تحصل الفئة التابعة على جميع الدوال (methods) من جميع الفئات الأصلية. يقوم Python بفحص الفئات الأصلية من اليسار إلى اليمين عند البحث عن الدوال.
التحدي
متوسطفي هذا التحدي، ستقوم بتنفيذ نظام فئات متعدد الملفات يوضح الوراثة المتعددة مع الهواتف الذكية. يتم تنظيم كل فئة في ملف خاص بها لتحسين تنظيم الكود.
ستحتاج إلى تعديل هذه الملفات:
device.py- قم بتنفيذ الفئة الأساسيةDeviceinternet.py- قم بتنفيذ الفئة الأساسيةInternetsmartphone.py- قم بتنفيذ الفئةSmartphoneالتي ترث من كلتا الفئتين الأساسيتينdriver.py- قم بتنفيذ حالات الاختبار التي ستتحقق من أن تنفيذك يعمل بشكل صحيح
يحتوي كل ملف على تعليقات TODO مفصلة سترشدك خطوة بخطوة خلال التنفيذ.
ورقة مرجعية
يسمح التعدد في الوراثة (Multiple inheritance) للفئة بالوراثة من أكثر من فئة أب واحدة باستخدام الصيغة class Child(Parent1, Parent2):
class Animal:
def __init__(self, name):
self.name = name
def eat(self):
return f"{self.name} is eating"
class Flyable:
def fly(self):
return f"{self.name} is flying"
class Bird(Animal, Flyable):
def __init__(self, name, species):
super().__init__(name) # Calls Animal's __init__
self.species = species
def sing(self):
return f"{self.name} is singing"ترث الفئة الابنة جميع الدوال (methods) من جميع فئات الآباء:
sparrow = Bird("Sparrow", "House sparrow")
print(sparrow.eat()) # من فئة Animal
print(sparrow.fly()) # من فئة Flyable
print(sparrow.sing()) # دالة خاصة بفئة Birdتحقق من ترتيب دقة الدوال (Method Resolution Order - MRO) لمعرفة أي فئة أب يتم التحقق منها أولاً:
print(Bird.__mro__) # يعرض ترتيب الوراثةجرّب بنفسك
# TODO: استيراد فئة Smartphone من smartphone.py
# إنشاء هاتف ذكي واختبار وظائفه
# TODO: إنشاء كائن Smartphone بالعلامة التجارية "Apple" والطراز "iPhone 13"
my_phone = None
# TODO: استدعاء وطباعة وظيفة power_on() للهاتف الذكي
# TODO: استدعاء وطباعة وظيفة connect() للهاتف الذكي
# TODO: استدعاء وطباعة وظيفة make_call() للهاتف الذكي مع المعامل "123-456-7890"يتضمن هذا الدرس اختبارًا قصيرًا. ابدأ الدرس للإجابة عليه وتتبّع تقدمك.
جميع دروس Object Oriented Programming
1أساسيات OOP
الملفات الخارجيةمقدمة في OOPClasses مقابل Objectsمعامل selfMethodsAttributesدالة البناء (__init__)مراجعة - آلة حاسبة بسيطة4الوراثة
الوراثة الأساسيةدالة ()superإعادة تعريف الدوال (Method Overriding)الوراثة المتعددةترتيب استدعاء الدوال (Method Resolution Order)مراجعة - هيكلية الموظفين5تعدد الأشكال
مراجعة إعادة تعريف الدوالمفهوم Duck Typingالأصناف والدوال المجردةتصميم الواجهاتملخص - حاسبة الأشكال