مراجعة إعادة تعريف الدوال
جزء من قسم Object Oriented Programming في رحلة Python على Coddy — الدرس 23 من 64.
تعدد الأشكال (Polymorphism) تعني "أشكالاً متعددة" وتسمح للكائنات من فئات (classes) مختلفة بالاستجابة بشكل مختلف لنفس استدعاء الطريقة (method call). تجعل عملية Method overriding هذا ممكناً.
إليك فئة أب (parent class) تحتوي على طريقة (method):
class Animal:
def speak(self):
return "Animal makes a sound"أنشئ فئات فرعية تقوم بتجاوز نفس الدالة (method):
class Dog(Animal):
def speak(self):
return "Woof!"
class Cat(Animal):
def speak(self):
return "Meow!"
class Cow(Animal):
def speak(self):
return "Moo!"توفر كل فئة فرعية تنفيذها الخاص لـ speak().
قم بإنشاء قائمة بحيوانات مختلفة:
animals = [Dog(), Cat(), Cow(), Animal()]استدعاء نفس الطريقة على جميع الكائنات:
for animal in animals:
print(animal.speak())المخرجات:
Woof!
Meow!
Moo!
Animal makes a soundهذا هو تعدد الأشكال (polymorphism) قيد التنفيذ - استدعاء الطريقة نفسه يتصرف بشكل مختلف بناءً على النوع الفعلي للكائن.
يمكنك أيضاً استخدام تعدد الأشكال (polymorphism) مع الدوال:
def make_animal_speak(animal):
print(animal.speak())
dog = Dog()
cat = Cat()
make_animal_speak(dog) # !هوهو
make_animal_speak(cat) # !مياولا تحتاج الدالة إلى معرفة نوع الحيوان الذي تستقبله - فهي ببساطة تستدعي speak() وتحصل على السلوك الصحيح.
نقطة رئيسية: يسمح لك تعدد الأشكال (Polymorphism) بالتعامل مع كائنات مختلفة بنفس الطريقة من خلال واجهة مشتركة. يوفر تجاوز الدوال (Method overriding) عمليات تنفيذ مختلفة، بينما يتيح لك تعدد الأشكال استدعاءها بشكل موحد. هذا يجعل الكود أكثر مرونة وأسهل في التوسع.
التحدي
متوسطفي هذا التحدي، ستقوم بتنفيذ نظام وراثة للمركبات.
ستحتاج إلى تعديل هذه الملفات:
vehicle.py: قم بتنفيذ الفئة الأساسيةVehicleمع سمات make/model والأساليبcar.py: قم بإنشاء الفئةCarالتي ترث منVehiclemotorcycle.py: قم بإنشاء الفئةMotorcycleالتي ترث منVehicletruck.py: قم بإنشاء الفئةTruckالتي ترث منVehicle
يحتوي كل ملف على تعليقات TODO مفصلة لتوجيه تنفيذك خطوة بخطوة. انتبه إلى بيانات الاستيراد المطلوبة بين الملفات واتبع علاقات الوراثة. يحتوي ملف driver.py على حالات اختبار ستتحقق من أن تنفيذك يعمل بشكل صحيح عبر جميع أنواع المركبات.
ورقة مرجعية
يسمح تعدد الأشكال (Polymorphism) للكائنات من فئات مختلفة بالاستجابة بشكل مختلف لنفس استدعاء الطريقة من خلال تجاوز الطريقة (method overriding).
قم بإنشاء فئة أب (parent class) مع طريقة (method):
class Animal:
def speak(self):
return "Animal makes a sound"الفئات التابعة (Child classes) تقوم بتجاوز نفس الطريقة:
class Dog(Animal):
def speak(self):
return "Woof!"
class Cat(Animal):
def speak(self):
return "Meow!"استدعاء نفس الطريقة على كائنات مختلفة:
animals = [Dog(), Cat(), Animal()]
for animal in animals:
print(animal.speak()) # كل منها يطبع مخرجات مختلفةاستخدام تعدد الأشكال مع الدوال:
def make_animal_speak(animal):
print(animal.speak())
make_animal_speak(Dog()) # Woof!
make_animal_speak(Cat()) # Meow!يتيح لك تعدد الأشكال التعامل مع كائنات مختلفة بنفس الطريقة من خلال واجهة مشتركة، مما يجعل الكود أكثر مرونة وأسهل في التوسيع.
جرّب بنفسك
from vehicle import Vehicle
from car import Car
from motorcycle import Motorcycle
from truck import Truck
def vehicle_info(vehicle):
return f"{vehicle.make} {vehicle.model}: {vehicle.start()}, Efficiency: {vehicle.fuel_efficiency()} mpg"
# اختبار مع مركبات مختلفة - لا تقم بتعديل كود الاختبار هذا
vehicles = [
Car("Toyota", "Camry"),
Motorcycle("Harley", "Davidson"),
Truck("Ford", "F-150"),
Vehicle("Generic", "Vehicle")
]
for v in vehicles:
print(vehicle_info(v))يتضمن هذا الدرس اختبارًا قصيرًا. ابدأ الدرس للإجابة عليه وتتبّع تقدمك.
جميع دروس Object Oriented Programming
1أساسيات OOP
الملفات الخارجيةمقدمة في OOPClasses مقابل Objectsمعامل selfMethodsAttributesدالة البناء (__init__)مراجعة - آلة حاسبة بسيطة4الوراثة
الوراثة الأساسيةدالة ()superإعادة تعريف الدوال (Method Overriding)الوراثة المتعددةترتيب استدعاء الدوال (Method Resolution Order)مراجعة - هيكلية الموظفين5تعدد الأشكال
مراجعة إعادة تعريف الدوالمفهوم Duck Typingالأصناف والدوال المجردةتصميم الواجهاتملخص - حاسبة الأشكال