Menu
Coddy logo textTech
flag Ar iconالعربيةdown icon

مراجعة إعادة تعريف الدوال

جزء من قسم 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) عمليات تنفيذ مختلفة، بينما يتيح لك تعدد الأشكال استدعاءها بشكل موحد. هذا يجعل الكود أكثر مرونة وأسهل في التوسع.

challenge icon

التحدي

متوسط

في هذا التحدي، ستقوم بتنفيذ نظام وراثة للمركبات.

ستحتاج إلى تعديل هذه الملفات:

  • vehicle.py: قم بتنفيذ الفئة الأساسية Vehicle مع سمات make/model والأساليب
  • car.py: قم بإنشاء الفئة Car التي ترث من Vehicle
  • motorcycle.py: قم بإنشاء الفئة Motorcycle التي ترث من Vehicle
  • truck.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))
quiz iconاختبر نفسك

يتضمن هذا الدرس اختبارًا قصيرًا. ابدأ الدرس للإجابة عليه وتتبّع تقدمك.

جميع دروس Object Oriented Programming