البرمجة كائنية التوجه (OOP) في بايثون: المفهوم والأساسيات ببساطة


البرمجة كائنية التوجه (OOP) في بايثون: المفهوم والأساسيات ببساطة

ماذا سنتعلم؟ في هذا الدرس، سنتعلم أساسيات البرمجة كائنية التوجه (OOP) في بايثون، وكيفية بناء الفئات (Classes) والكائنات (Objects) لفهم أفضل لتنظيم الكود.

1. المفهوم الأساسي للفئات (Classes) والكائنات (Objects)

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

لنبدأ بتعريف فئة بسيطة لتمثيل سيارة:

class Car:
    # هذه هي الفئة (Class) التي تمثل مخططًا للسيارات
    # حاليًا لا تحتوي على أي خصائص أو سلوكيات محددة
    pass

في هذا الجزء، قمنا بتعريف فئة اسمها Car. كلمة pass تعني أن الفئة لا تحتوي على أي محتوى حالياً، لكنها موجودة ككيان.

الآن، لنقم بإنشاء كائنات (Objects) من هذه الفئة:

# إنشاء كائن (Object) من الفئة Car
my_car = Car()
your_car = Car()

# طباعة نوع الكائنات للتحقق
print(type(my_car))
print(type(your_car))

هنا، my_car و your_car هما كائنان منفصلان تم إنشاؤهما من نفس الفئة Car. كل منهما يمثل سيارة خاصة به.

ملاحظة تقنية: الفئة هي قالب، والكائن هو تجسيد لهذا القالب. كل كائن له حالته الخاصة وسلوكه الخاص، حتى لو كانا من نفس الفئة.

2. إضافة الخصائص (Attributes) باستخدام الدالة __init__

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

سنقوم بتعديل فئة Car لتشمل خصائص مثل make (الشركة المصنعة)، model (الموديل)، و year (سنة الصنع):

class Car:
    def __init__(self, make, model, year):
        # الدالة البانية (Constructor) تُستدعى عند إنشاء كائن جديد
        # self يشير إلى الكائن الحالي الذي يتم إنشاؤه
        self.make = make    # خاصية (Attribute) لاسم الشركة المصنعة
        self.model = model  # خاصية لنوع الموديل
        self.year = year    # خاصية لسنة الصنع

# إنشاء كائنات بخصائص مختلفة
my_car = Car("Toyota", "Camry", 2020)
your_car = Car("Honda", "Civic", 2022)

# الوصول إلى خصائص الكائنات
print(f"سيارتي: {my_car.make} {my_car.model} {my_car.year}")
print(f"سيارتك: {your_car.make} {your_car.model} {your_car.year}")

الآن، عند إنشاء كائن Car، يجب أن نمرر له قيم make، model، و year. هذه القيم تُخزن كخصائص خاصة بالكائن باستخدام self.attribute_name.

ملاحظة تقنية: الدالة __init__ هي دالة خاصة تُعرف باسم "المُنشئ" (Constructor) وتُستخدم لتهيئة الكائن عند إنشائه. المتغير self هو أول وسيط يُمرر لجميع دوال الفئة ويشير إلى الكائن الحالي.

3. إضافة السلوكيات (Methods)

بالإضافة إلى الخصائص، يمكن للكائنات أن تحتوي على سلوكيات أو وظائف خاصة بها. هذه الوظائف تُسمى "أساليب" (Methods) في OOP، وهي ببساطة دوال تُعرف داخل الفئة وتعمل على بيانات الكائن.

لنضف أسلوبًا (Method) إلى فئة Car لعرض معلومات السيارة:

class Car:
    def __init__(self, make, model, year):
        self.make = make
        self.model = model
        self.year = year

    def display_info(self):
        # دالة (Method) لعرض معلومات السيارة
        # self يسمح بالوصول إلى خصائص الكائن مثل self.make
        return f"هذه سيارة {self.make} موديل {self.model} سنة {self.year}."

# إنشاء كائنات واستدعاء دوالها
my_car = Car("Toyota", "Camry", 2020)
your_car = Car("Honda", "Civic", 2022)

print(my_car.display_info())
print(your_car.display_info())

الآن، كل كائن من نوع Car يمكنه استدعاء الأسلوب display_info() لطباعة معلوماته الخاصة. لاحظ أن display_info تستخدم self للوصول إلى خصائص الكائن.

ملاحظة تقنية: الدوال داخل الفئات تُسمى "أساليب" (Methods). مثل الدوال العادية، لكنها تعمل على بيانات الكائن الذي تنتمي إليه، وتأخذ self كأول وسيط لها بشكل ضمني.

الكود النهائي الكامل

إليك الكود كاملاً الذي قمنا ببنائه خطوة بخطوة:

class Car:
    def __init__(self, make, model, year):
        # الدالة البانية (Constructor) تُستدعى عند إنشاء كائن جديد
        # self يشير إلى الكائن الحالي الذي يتم إنشاؤه
        self.make = make    # خاصية (Attribute) لاسم الشركة المصنعة
        self.model = model  # خاصية لنوع الموديل
        self.year = year    # خاصية لسنة الصنع

    def display_info(self):
        # دالة (Method) لعرض معلومات السيارة
        # self يسمح بالوصول إلى خصائص الكائن مثل self.make
        return f"هذه سيارة {self.make} موديل {self.model} سنة {self.year}."

# إنشاء كائنات (Objects) من الفئة Car
my_car = Car("Toyota", "Camry", 2020)
your_car = Car("Honda", "Civic", 2022)
another_car = Car("Ford", "Focus", 2018)

# الوصول إلى خصائص الكائنات
print(f"معلومات سيارتي: {my_car.make} {my_car.model} ({my_car.year})")
print(f"معلومات سيارتك: {your_car.make} {your_car.model} ({your_car.year})")

# استدعاء الدوال (Methods) على الكائنات
print(my_car.display_info())
print(your_car.display_info())
print(another_car.display_info())

النتيجة المتوقعة

عند تشغيل السكربت أعلاه، ستحصل على المخرجات التالية في الطرفية:

معلومات سيارتي: Toyota Camry (2020)
معلومات سيارتك: Honda Civic (2022)
هذه سيارة Toyota موديل Camry سنة 2020.
هذه سيارة Honda موديل Civic سنة 2022.
هذه سيارة Ford موديل Focus سنة 2018.