مقدمة عملية في البرمجة الكائنية OOP
ما هي البرمجة الكائنية؟
الدرس التاسع: مقدمة عملية في البرمجة الكائنية (OOP)
في الدروس السابقة، تعلمنا كيفية كتابة دوال (Functions) لتنظيم الكود، وكيفية التعامل مع القوائم والقواميس لتخزين البيانات. لكن مع تزايد تعقيد البرامج، نجد أن الدوال وحدها قد لا تكون كافية لتنظيم الكود بطريقة سهلة الصيانة والتطوير. هنا يأتي دور البرمجة الكائنية (Object-Oriented Programming - OOP).
ما هي البرمجة الكائنية؟
البرمجة الكائنية هي أسلوب برمجي يعتمد على فكرة "الكائنات" (Objects). الكائن هو وحدة تجمع بين البيانات (Attributes) و السلوكيات (Methods) في مكان واحد. بدلاً من كتابة دوال منفصلة ومتغيرات متفرقة، نقوم بإنشاء "فئة" (Class) تمثل قالباً أو مخططاً، ثم ننشئ من هذا القالب كائنات متعددة.
لماذا نحتاجها؟
- إعادة الاستخدام (Reusability): يمكنك إنشاء فئة واحدة واستخدامها لإنشاء آلاف الكائنات.
- تنظيم الكود (Organization): يصبح الكود أكثر وضوحاً وسهولة في القراءة، لأن كل جزء من البرنامج له مسؤوليته الخاصة.
- سهولة الصيانة (Maintainability): إذا أردت تعديل سلوك معين، تقوم بتعديله في مكان واحد فقط (داخل الفئة).
- محاكاة العالم الحقيقي (Real-world Modeling): يمكنك تمثيل أشياء حقيقية مثل "سيارة" أو "مستخدم" أو "مهمة" ككائنات في الكود.
الفئة (Class) والكائن (Object)
لنفهم الفرق بين الفئة والكائن، تخيل أن الفئة هي "مخطط بناء منزل". هذا المخطط يحدد أن المنزل سيكون له غرف ونوافذ وأبواب. أما الكائن فهو "المنزل الفعلي" الذي تم بناؤه وفقاً لهذا المخطط. يمكنك بناء 10 منازل من نفس المخطط، وكل منزل هو كائن مستقل.
خطوات إنشاء فئة وكائن في بايثون
لنبدأ بمثال عملي. سنقوم بإنشاء فئة بسيطة تمثل "مستخدم" (User).
# الخطوة 1: تعريف الفئة باستخدام الكلمة المفتاحية class
class User:
# دالة __init__ هي المنشئ (Constructor) الذي يتم استدعاؤه تلقائياً عند إنشاء كائن جديد
def __init__(self, name, email):
# self يشير إلى الكائن الحالي
# نقوم بتخزين البيانات في خصائص (Attributes) خاصة بالكائن
self.name = name
self.email = email
self.is_active = True # قيمة افتراضية
# الخطوة 2: تعريف دالة (Method) تابعة للفئة
def display_info(self):
# هذه الدالة تطبع معلومات المستخدم
print(f"Name: {self.name}, Email: {self.email}, Active: {self.is_active}")
def deactivate(self):
# دالة لتغيير حالة المستخدم
self.is_active = False
print(f"User {self.name} has been deactivated.")
# الخطوة 3: إنشاء كائنات (Objects) من الفئة
user1 = User("Ahmed", "ahmed@example.com")
user2 = User("Sara", "sara@example.com")
# استخدام الكائنات
user1.display_info() # الإخراج: Name: Ahmed, Email: ahmed@example.com, Active: True
user2.display_info() # الإخراج: Name: Sara, Email: sara@example.com, Active: True
user1.deactivate() # الإخراج: User Ahmed has been deactivated.
user1.display_info() # الإخراج: Name: Ahmed, Email: ahmed@example.com, Active: False
شرح الكود خطوة بخطوة
- class User: نبدأ بتعريف الفئة باستخدام الكلمة المفتاحية
classمتبوعة باسم الفئة (يُفضل أن يبدأ بحرف كبير). - def __init__(self, name, email): هذه هي دالة التهيئة (Initializer). يتم استدعاؤها تلقائياً عند إنشاء كائن جديد. المعامل
selfهو إشارة إلى الكائن نفسه، ويجب أن يكون أول معامل في كل دالة تابعة للفئة. - self.name = name: نقوم بإنشاء خاصية (Attribute) باسم
nameللكائن الحالي، ونخزن فيها القيمة التي تم تمريرها. - def display_info(self): هذه دالة (Method) يمكن للكائن استدعاءها. لاحظ أن
selfموجود هنا أيضاً للوصول إلى خصائص الكائن. - user1 = User("Ahmed", "ahmed@example.com"): هنا نقوم بإنشاء كائن جديد من الفئة
User. يتم تمرير القيم إلى دالة__init__.
self كأول معامل في كل دالة داخل الفئة. هذا هو الخطأ الأكثر شيوعاً بين المبتدئين.
أخطاء شائعة وكيفية تجنبها
- نسيان
self: إذا نسيت كتابةselfفي تعريف الدالة، ستحصل على خطأ عند استدعائها. - عدم استخدام
selfللوصول إلى الخصائص: داخل الدالة، يجب استخدامself.nameوليسnameفقط. - الخلط بين الفئة والكائن: تذكر أن الفئة هي المخطط، والكائن هو الناتج الفعلي. لا تحاول استدعاء دالة من الفئة مباشرة (مثلاً
User.display_info()) دون إنشاء كائن أولاً.
مثال عملي إضافي: إدارة المهام (Tasks)
لنقم ببناء فئة بسيطة تمثل مهمة (Task) كما سنفعل لاحقاً في مشروعنا النهائي.
class Task:
def __init__(self, title, description):
self.title = title
self.description = description
self.completed = False
def mark_complete(self):
self.completed = True
print(f"Task '{self.title}' is now complete.")
def show_task(self):
status = "✓" if self.completed else "✗"
print(f"[{status}] {self.title}: {self.description}")
# إنشاء مهام
task1 = Task("Learn OOP", "Study classes and objects in Python")
task2 = Task("Build API", "Create a simple REST API with FastAPI")
# عرض المهام
task1.show_task() # الإخراج: [✗] Learn OOP: Study classes and objects in Python
task2.show_task() # الإخراج: [✗] Build API: Create a simple REST API with FastAPI
# إكمال المهمة الأولى
task1.mark_complete() # الإخراج: Task 'Learn OOP' is now complete.
task1.show_task() # الإخراج: [✓] Learn OOP: Study classes and objects in Python
الخلاصة
في هذا الدرس، تعلمنا أن البرمجة الكائنية تساعدنا في تنظيم الكود عن طريق تجميع البيانات والسلوكيات في كائنات. الفئة (Class) هي القالب، والكائن (Object) هو الناتج الفعلي. استخدمنا __init__ لتهيئة الكائنات، وself للإشارة إلى الكائن الحالي. هذا المفهوم هو حجر الأساس لبناء تطبيقات معقدة مثل الـ APIs.
تمرين صغير
قم بإنشاء فئة جديدة باسم Book تحتوي على:
- خصائص:
title(عنوان الكتاب)،author(المؤلف)،pages(عدد الصفحات)،is_borrowed(حالة الاستعارة، وتبدأ بـFalse). - دالة
borrow()تغير حالةis_borrowedإلىTrueوتطبع رسالة. - دالة
return_book()تغير الحالة إلىFalseوتطبع رسالة. - دالة
display()تطبع معلومات الكتاب.
ثم قم بإنشاء كائنين من الفئة وجرب استعارة أحدهما وعرض معلوماتهما.
جاري تحميل التقييمات...