Python: الفئات والكائنات
آخر تحديث: 2026-09-22
في الدروس القليلة الماضية، نظّمنا الكود باستخدام الدوال — نهج "إجرائي" يركز على "ماذا تفعل." البرمجة كائنية التوجه (OOP) تركز على "من يفعل" — تضمين البيانات والطرق التي تعمل على تلك البيانات في كائن. كل شيء في بايثون هو كائن؛ فهم OOP هو خطوة رئيسية للأمام.
1. ما هي الفئات والكائنات
الفئة هي مخطط؛ الكائن هو نسخة ملموسة تم إنشاؤها من ذلك المخطط.
# عرّف فئة "كلب" — المخطط
class Dog:
pass
# أنشئ كائنات "كلب" محددة من المخطط
my_dog = Dog()
print(type(my_dog)) # <class '__main__.Dog'>
print(my_dog) # <__main__.Dog object at 0x...>
مثل "الكلب" كسلالة هو مفهوم (فئة)، الكلب المحدد المسمى Wangcai الذي تملكه هو نسخة (كائن). فئة واحدة يمكنها إنشاء عدد لا يحصى من الكائنات.
2. __init__: طريقة المُنشئ
عند إنشاء كائن، يتم استدعاء طريقة __init__ تلقائياً لتهيئة سمات الكائن:
class Dog:
"""فئة الكلب"""
def __init__(self, name, age):
self.name = name # سمة المثال
self.age = age
# مرر المعاملات عند إنشاء الكائنات
dog1 = Dog("Wangcai", 3)
dog2 = Dog("Xiaobai", 1)
print(dog1.name) # Wangcai
print(dog2.name) # Xiaobai
print(dog1.age) # 3
ملاحظة:
__init__ليس المُنشئ — الكائن يُنشأ قبل استدعائه. المُنشئ الفعلي هو__new__، لكنك لا تحتاج أبداً للمساس به تقريباً. المعامل الأول لـ__init__هو دائماًself، الذي يمثل نسخة الكائن الحالية.
▶ مثال: تعريف فئة طالب (الصعوبة ⭐)
▶ جرّب الكودالناتج:
# Function defined successfully
3. الطرق: سلوكيات الكائن
الدوال المُعرّفة داخل الفئة تُسمى طرقاً. معاملها الأول هو دائماً self — الذي يمثل الكائن نفسه الذي يستدعي الطريقة.
class Calculator:
"""آلة حاسبة بسيطة"""
def __init__(self):
self.result = 0
def add(self, value):
self.result += value
return self
def subtract(self, value):
self.result -= value
return self
def show(self):
return self.result
calc = Calculator()
calc.add(10)
calc.subtract(3)
print(calc.show()) # 7
# تسلسل الطرق — كل طريقة تُرجع self
result = Calculator().add(10).subtract(3).add(5).show()
print(result) # 12
self يمكن تسلسلها. العديد من مكتبات بايثون (مثل pandas) تستخدم هذا النمط بشكل مكثف.
4. سمات المثال مقابل سمات الفئة
يمكن تعريف السمات على المثال (فريدة لكل كائن) أو على الفئة (مشتركة بين جميع الكائنات):
class Student:
# سمة الفئة — مشتركة بين جميع الطلاب
school = "First High School"
total_count = 0
def __init__(self, name):
# سمة المثال — فريدة لكل طالب
self.name = name
Student.total_count += 1
s1 = Student("Zhang San")
s2 = Student("Li Si")
# سمات الفئة تُتاح عبر اسم الفئة
print(Student.school) # First High School
print(Student.total_count) # 2
# يمكن الوصول إليها أيضاً عبر المثيلات (إذا لم توجد سمة مثال بنفس الاسم)
print(s1.school) # First High School
print(s2.school) # First High School
# تعديل سمة الفئة يؤثر على جميع المثيلات
Student.school = "Second High School"
print(s1.school) # Second High School
▶ مثال: حساب بنكي (الصعوبة ⭐⭐)
▶ جرّب الكودالناتج:
# Function defined successfully
▶ مثال: فئة إدارة درجات الطلاب (الصعوبة ⭐⭐)
▶ جرّب الكودالمخرجات:
Student: Alice (001)
Chinese: 85 (Pass)
Math: 72 (Pass)
English: 90 (Pass)
Average: 82.3
Student: Bob (002)
Chinese: 55 (Fail)
Math: 48 (Fail)
Average: 51.5
Total students: 2
5. حالات الاستخدام الشائعة
- نمذجة البيانات: طبّق كيانات العالم الحقيقي إلى كود — المستخدمون والطلبات والمنتجات كلها ممثلة بفئات.
- إدارة الحالة: الكائنات تحتفظ بحالة (سمات)، والطرق تعالج تلك الحالة — مثل شخصيات اللعبة، عربات التسوق.
- تنظيم الكود: البيانات والوظائف ذات الصلة مُجمّعة معاً، أنظف من الدوال المتناثرة.
- تمديد الأطراف: نماذج Django، تطبيق Flask، مكونات واجهة المستخدم الرسومية كلها مُنفّذة عبر الفئات.
❓ أسئلة شائعة
self كأول معامل. الدوال يمكن أن توجد بشكل مستقل؛ الطرق يجب أن تُستدعَى عبر كائن أو فئة. أساساً، الطرق هي دوال حيث تمرر بايثون المتصل تلقائياً كأول وسيطة.self إلى شيء آخر؟self هي قاعدة صارمة في مجتمع بايثون. تغيير الاسم سيعمل، لكن أي شخص يقرأ كودك (بما فيهم أنت في المستقبل) سيجده غريباً. استخدم دائماً self.📖 ملخص
- الفئة هي مخطط؛ الكائن هو نسخة ملموسة تم إنشاؤها منه
__init__هي طريقة التهيئة، تُستدعى تلقائياً عند إنشاء كائن- المعامل الأول للطرق هو
self، الذي يمثل الكائن الحالي - سمات المثال فريدة لكل كائن؛ سمات الفئة مشتركة بين جميع الكائنات
- الفئات تضم البيانات والطرق التي تعمل على تلك البيانات معاً
📝 تمارين
-
مبتدئ (الصعوبة ⭐): عرّف فئة
Carبسماتbrandوcolorوspeed. تضمين طريقةaccelerate(value)لزيادة السرعة وطريقةshow_speed()لعرض السرعة الحالية. -
متوسط (الصعوبة ⭐⭐): عرّف فئة
Student. استخدم سمة فئة لتتبع العدد الإجمالي للطلاب، وسمات مثال لتسجيل اسم ودرجة كل طالب. نفّذ طريقةget_grade()تُرجع تقديراً حرفياً (A, B, C, D). -
متقدم (الصعوبة ⭐⭐⭐): عرّف فئة
LibraryوفئةBook.Bookلها عنوان ومؤلف وحالة استعارة.Libraryلها أربع طرق:add_book(book)،borrow(title)،return_book(title)، وshow_books().