بعد أن تعلمت المتغيرات، الشروط، الحلقات، الدوال، القوائم، القواميس، الملفات، والتعامل مع الأخطاء، ستبدأ بملاحظة أن بعض البرامج تجمع بيانات مرتبطة مع وظائف تعمل على تلك البيانات. مثلًا: طالب له اسم ودرجة، ومنتج له اسم وسعر، ومهمة لها عنوان وحالة.
يمكنك تمثيل هذه البيانات بقاموس أو مجموعة متغيرات عندما يكون المثال صغيرًا. لكن عندما يتوسع البرنامج وتحتاج إلى إنشاء أكثر من طالب أو منتج أو مهمة، يصبح تنظيم البيانات والعمليات داخل Class خطوة مفيدة جدًا. لهذا سنتعلم في هذا الدرس معنى class وobject في Python بطريقة هادئة وعملية، دون الدخول في مفاهيم متقدمة قبل وقتها.
{alertInfo} الفكرة ببساطة: الـclassهي قالب أو مخطط يصف نوعًا من الأشياء، أما الـobjectفهو نسخة حقيقية تنشئها من هذا القالب. يمكن أن يحمل كل object بياناته الخاصة، ويستخدم الدوال الموجودة داخل class.
{getToc} $title={محتوى المقال}
ما معنى class في Python؟
الـ class هي طريقة لتعريف نوع جديد من الكائنات داخل برنامجك. يمكنك وضع بيانات مرتبطة مع دوال مرتبطة بها في مكان واحد، ثم إنشاء نسخ متعددة من هذا النوع.
تخيل أنك تريد تمثيل طلاب داخل برنامج. كل طالب لديه اسم وعمر ودرجة، وقد تحتاج إلى دالة تطبع بياناته أو تحدد هل اجتاز المادة. بدل أن تكتب متغيرات ودوال منفصلة لكل طالب، يمكنك إنشاء قالب واحد اسمه Student.
توثيق Python الرسمي يشرح أن class تجمع البيانات والوظائف معًا، وأن إنشاء class يسمح بإنتاج objects متعددة من النوع نفسه.
ما معنى object في Python؟
الـ object هو نسخة تنشئها من class. إذا كانت class هي مخطط سيارة، فالـ object هو سيارة فعلية تم تصنيعها من ذلك المخطط. يمكن أن يكون لديك عدة سيارات من النوع نفسه، لكن لكل واحدة لون ولوحة ورقم مختلف.
في Python، يمكننا إنشاء class فارغة للتجربة:
class Student:
pass
الكلمة pass تعني أن class موجودة، لكننا لم نضف لها أي محتوى بعد. ثم ننشئ object منها بوضع اسم class مع أقواس:
student_one = Student()
print(student_one)
سيظهر لك تمثيل للكائن ومكانه في الذاكرة، وقد يختلف النص الذي يظهر من جهاز لآخر. المهم أن السطر Student() أنشأ object جديدًا.
الفرق بين class و object
| المفهوم | المعنى | مثال |
|---|---|---|
class |
القالب أو التعريف العام الذي يصف نوع الشيء وخصائصه ودواله. | Student |
object |
نسخة حقيقية تم إنشاؤها من class، ولها بياناتها الخاصة. | student_one = Student() |
| Attribute | بيانات أو خاصية محفوظة داخل object. | student_one.name |
| Method | دالة داخل class تعمل غالبًا على بيانات object. | student_one.show_info() |
يمكنك إنشاء أكثر من object من class واحدة. كل object يحتفظ بقيمه الخاصة:
class Student:
pass
student_one = Student()
student_two = Student()
student_one.name = "Ali"
student_two.name = "Sara"
print(student_one.name)
print(student_two.name)
Ali
Sara
هذه الطريقة تعمل، لكن إضافة الخصائص يدويًا بعد كل object ليست منظمة عندما يكبر البرنامج. لذلك نستخدم غالبًا الدالة الخاصة __init__.
ما هي __init__ في Python؟
__init__ هي دالة خاصة تُنفذ تلقائيًا بعد إنشاء object. تستخدم غالبًا لوضع القيم الأساسية التي نريد أن يملكها كل object من هذا النوع.
في مثال الطالب، نريد أن يحصل كل طالب عند إنشائه على اسم وعمر ودرجة. لذلك نكتب:
class Student:
def __init__(self, name, age, score):
self.name = name
self.age = age
self.score = score
والآن ننشئ الطلاب بهذه الطريقة:
student_one = Student("Ali", 20, 88)
student_two = Student("Sara", 19, 94)
print(student_one.name)
print(student_two.score)
Ali
94
هنا مررت القيم عند إنشاء كل object، واحتفظ كل طالب بقيمه الخاصة. هذه طريقة أوضح وأقل عرضة للنسيان من إضافة البيانات يدويًا لاحقًا.
ما معنى self ولماذا نكتبها؟
كلمة self تشير إلى object الحالي الذي تعمل عليه الدالة. عندما تكتب self.name فأنت تقول: احفظ أو استخدم الاسم الخاص بهذا الطالب تحديدًا.
لا تمرر self بنفسك عند إنشاء object. Python تمرر object الحالي تلقائيًا عندما تستدعي method من object. ولهذا نكتب:
student_one = Student("Ali", 20, 88)
ولا نكتب هذا:
# خطأ: لا تمرر self يدويًا
student_one = Student(self, "Ali", 20, 88)
الاسم self هو الاسم المتعارف عليه في Python. تقنيًا يمكن كتابة اسم آخر، لكن الالتزام بـ self يجعل كودك مفهومًا لأي شخص يقرأه.
ما هي methods داخل class؟
الـ method هي دالة تُكتب داخل class. تستخدم عادةً لتنفيذ عملية مرتبطة ببيانات object. مثلًا، يمكن للطالب أن يطبع معلوماته أو يعرف هل درجته ناجحة.
class Student:
def __init__(self, name, age, score):
self.name = name
self.age = age
self.score = score
def show_info(self):
print("الاسم:", self.name)
print("العمر:", self.age)
print("الدرجة:", self.score)
def is_passed(self):
return self.score >= 60
بعد ذلك ننشئ object ونستخدم methods:
student_one = Student("Ali", 20, 88)
student_one.show_info()
if student_one.is_passed():
print("الطالب ناجح")
else:
print("الطالب يحتاج إلى مراجعة")
الاسم: Ali
العمر: 20
الدرجة: 88
الطالب ناجح
لاحظ أن show_info() لا تحتاج إلى طلب الاسم أو العمر مرة أخرى، لأنها تصل إلى بيانات object عبر self. أما is_passed() فترجع قيمة منطقية True أو False، لذلك استخدمناها داخل شرط if.
مثال عملي كامل: برنامج بسيط لإدارة الكتب
في المثال التالي سننشئ class تمثل كتابًا. كل كتاب له عنوان ومؤلف وعدد صفحات، وسنضيف methods لعرض البيانات ومعرفة هل الكتاب طويل أم لا.
class Book:
def __init__(self, title, author, pages):
self.title = title
self.author = author
self.pages = pages
def show_details(self):
print("العنوان:", self.title)
print("المؤلف:", self.author)
print("عدد الصفحات:", self.pages)
def is_long(self):
return self.pages >= 300
book = Book(
"Python للمبتدئين",
"بايثون العرب",
320
)
book.show_details()
if book.is_long():
print("هذا كتاب طويل.")
else:
print("هذا كتاب قصير أو متوسط.")
يمكنك تغيير بيانات الكتاب أو إنشاء كتب أخرى من class نفسها:
second_book = Book(
"تعلم القوائم",
"بايثون العرب",
120
)
second_book.show_details()
هذه هي الفائدة العملية: تكتب تعريفًا منظمًا مرة واحدة، ثم تنشئ objects متعددة دون إعادة كتابة نفس المنطق لكل كتاب.
متى أستخدم class ومتى يكفي Dictionary أو Function؟
لا تحتاج إلى class في كل كود تكتبه. في البرامج الصغيرة جدًا، قد يكون Dictionary أو Function أوضح وأسرع للفهم. استخدم class عندما تكون لديك بيانات وعمليات مرتبطة بها، أو عندما ستنشئ عدة objects من النوع نفسه.
| الحالة | الخيار المناسب غالبًا | مثال |
|---|---|---|
| قيمة بسيطة أو عملية قصيرة | متغير أو Function | دالة تحسب خصمًا لسعر واحد. |
| بيانات صغيرة بدون عمليات كثيرة | Dictionary | قاموس يحتوي اسم الطالب وعمره فقط. |
| عدة بيانات متشابهة مع عمليات خاصة بها | Class | طلاب، منتجات، كتب، مهام، حسابات. |
| مشروع يتوسع إلى ملفات ووظائف كثيرة | Classes منظمة عند الحاجة | برنامج إدارة مهام أو متجر صغير. |
{alertWarning} لا تستخدم class لمجرد أنها موجودة: إذا كان المثال بسيطًا جدًا ولا يحتوي على بيانات وعمليات مترابطة، قد يكون استخدام Function أو Dictionary أوضح. الهدف من class هو التنظيم، وليس زيادة تعقيد الكود.
أخطاء شائعة عند تعلم Classes في Python
1. نسيان الأقواس عند إنشاء object
هذا السطر يشير إلى class نفسها، ولا ينشئ object:
student_one = Student
الصحيح هو:
student_one = Student("Ali", 20, 88)
2. نسيان self داخل methods
عند تعريف method داخل class، يجب أن تستقبل self كأول parameter في methods العادية:
# خطأ
def show_info():
print("معلومات الطالب")
الصحيح:
def show_info(self):
print("معلومات الطالب")
3. كتابة اسم attribute بشكل مختلف
إذا أنشأت self.score داخل __init__ ثم كتبت لاحقًا self.scores، سيظهر خطأ لأنهما اسمان مختلفان. اختر أسماء واضحة وثابتة.
4. إعادة تعريف __init__ أكثر من مرة
داخل class واحدة، آخر دالة اسمها __init__ هي التي تبقى. لا تكتب عدة دوال __init__ وأنت تتوقع أن تعمل جميعها كأنها نسخ متعددة من constructor في لغات أخرى.
5. استخدام class variables قابلة للتعديل بلا فهم
في هذا الدرس ركزنا على بيانات كل object مثل self.name. لاحقًا ستتعلم الفرق بين instance attributes وclass attributes. لا تضع قائمة أو Dictionary قابلة للتعديل كقيمة مشتركة داخل class قبل أن تفهم كيف ستُشارك بين كل objects.
تمرين عملي
أنشئ class اسمها Product تحتوي على:
nameاسم المنتج.priceالسعر.- method اسمها
show_price()تطبع اسم المنتج وسعره. - method اسمها
discounted_price()تستقبل نسبة خصم وتعيد السعر بعد الخصم.
ابدأ بهذا القالب:
class Product:
def __init__(self, name, price):
# اكتب الكود هنا
pass
def show_price(self):
# اكتب الكود هنا
pass
def discounted_price(self, discount):
# اكتب الكود هنا
pass
حل مقترح
class Product:
def __init__(self, name, price):
self.name = name
self.price = price
def show_price(self):
print(self.name, "-", self.price)
def discounted_price(self, discount):
return self.price - (self.price * discount / 100)
book = Product("كتاب Python", 20)
book.show_price()
print("السعر بعد الخصم:", book.discounted_price(10))
ماذا تتعلم بعد class و object؟
بعد أن تفهم فكرة class وobject و__init__ وmethods، لا تحتاج إلى القفز مباشرة إلى الوراثة inheritance أو decorators أو تصميمات متقدمة. ثبّت الأساس أولًا عبر مشاريع صغيرة فيها كائنات واضحة، مثل برنامج كتب، مهام، منتجات، أو طلاب.
ثم يمكنك الانتقال لاحقًا إلى مواضيع مثل class attributes والوراثة وتنظيم classes داخل ملفات منفصلة. وفي الوقت الحالي، راجع الدروس التي ستساعدك على فهم الأمثلة السابقة:
- كورس أساسيات بايثون للمبتدئين من الصفر
- أساسيات بايثون 13: شرح Functions في Python للمبتدئين
- أساسيات بايثون 11: شرح if و else في Python للمبتدئين
- أساسيات بايثون 33: شرح assert في Python للمبتدئين
- بايثون بعد الأساسيات 4: بناء برنامج سطر أوامر CLI بسيط
الخلاصة
- الـ
classهي قالب يصف نوعًا من الأشياء، والـobjectهو نسخة حقيقية من هذا القالب. - الـ attributes هي البيانات الخاصة بالكائن، مثل الاسم أو الدرجة أو السعر.
- الدالة
__init__تساعدك على تجهيز بيانات object عند إنشائه. selfتشير إلى object الحالي وتسمح للدوال بالوصول إلى بياناته.- الـ methods هي دوال داخل class تنفذ عمليات مرتبطة ببيانات object.
- لا تستخدم class في كل حالة؛ استخدمها عندما تجمع بيانات مترابطة وعمليات مرتبطة بها أو تحتاج نسخًا متعددة من النوع نفسه.
{alertSuccess}
خطوتك العملية: خذ مثالًا بسيطًا كتبته سابقًا باستخدام Dictionary، مثل بيانات طالب أو منتج، وحاول تحويله إلى class تحتوي على __init__ وmethod واحدة فقط. لا تضف مفاهيم كثيرة دفعة واحدة؛ افهم class صغيرة أولًا ثم وسّعها تدريجيًا.
مصادر خارجية موثوقة للتوسع
أسئلة شائعة
ما الفرق بين class و object في Python؟
class هي القالب العام الذي يحدد البيانات والدوال، بينما object هو نسخة منشأة من هذا القالب. يمكن إنشاء عدة objects من class واحدة، ولكل object بياناته الخاصة.
هل self كلمة محجوزة في Python؟
لا، لكنها الاسم المتعارف عليه للوسيط الأول في methods الخاصة بالـ instance. استخدام الاسم self يجعل الكود واضحًا وموافقًا لأسلوب Python المعتاد.
هل يجب أن تحتوي كل class على __init__؟
لا. يمكنك إنشاء class بدون __init__ إذا لم تكن تحتاج إلى تجهيز بيانات عند إنشاء object. لكن في أغلب الأمثلة العملية تساعدك __init__ على جعل الإنشاء منظمًا وواضحًا.
هل class أفضل دائمًا من Dictionary؟
لا. Dictionary مناسبة للبيانات الصغيرة والبسيطة. أما class تصبح مفيدة عندما تتكرر البيانات نفسها في عدة objects وتحتاج إلى methods مرتبطة بها أو تريد تنظيم المشروع بصورة أفضل.
هل أبدأ بالوراثة Inheritance بعد هذا الدرس؟
يمكنك قراءتها لاحقًا، لكن الأفضل أولًا أن تتدرب على إنشاء classes بسيطة واستخدام __init__ وself وmethods. الوراثة ستكون أوضح عندما يصبح هذا الأساس مريحًا بالنسبة لك.




