
في الدروس السابقة، تعلمنا كيفية كتابة دوال (Functions) لتنظيم الكود، وكيفية التعامل مع القوائم والقواميس لتخزين البيانات. لكن مع تزايد تعقيد البرامج، نجد أن الدوال وحدها قد لا تكون كافية لتنظيم الكود بطريقة سهلة الصيانة والتطوير. هنا يأتي دور البرمجة الكائنية (Object-Oriented Programming - OOP).
البرمجة الكائنية هي أسلوب برمجي يعتمد على فكرة "الكائنات" (Objects). الكائن هو وحدة تجمع بين البيانات (Attributes) و السلوكيات (Methods) في مكان واحد. بدلاً من كتابة دوال منفصلة ومتغيرات متفرقة، نقوم بإنشاء "فئة" (Class) تمثل قالباً أو مخططاً، ثم ننشئ من هذا القالب كائنات متعددة.
لماذا نحتاجها؟
لنفهم الفرق بين الفئة والكائن، تخيل أن الفئة هي "مخطط بناء منزل". هذا المخطط يحدد أن المنزل سيكون له غرف ونوافذ وأبواب. أما الكائن فهو "المنزل الفعلي" الذي تم بناؤه وفقاً لهذا المخطط. يمكنك بناء 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 متبوعة باسم الفئة (يُفضل أن يبدأ بحرف كبير).self هو إشارة إلى الكائن نفسه، ويجب أن يكون أول معامل في كل دالة تابعة للفئة.name للكائن الحالي، ونخزن فيها القيمة التي تم تمريرها.self موجود هنا أيضاً للوصول إلى خصائص الكائن.User. يتم تمرير القيم إلى دالة __init__.self كأول معامل في كل دالة داخل الفئة. هذا هو الخطأ الأكثر شيوعاً بين المبتدئين.
self: إذا نسيت كتابة self في تعريف الدالة، ستحصل على خطأ عند استدعائها.self للوصول إلى الخصائص: داخل الدالة، يجب استخدام self.name وليس name فقط.User.display_info()) دون إنشاء كائن أولاً.لنقم ببناء فئة بسيطة تمثل مهمة (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() تطبع معلومات الكتاب.ثم قم بإنشاء كائنين من الفئة وجرب استعارة أحدهما وعرض معلوماتهما.
جاري تحميل التقييمات...