أساسيات بايثون 34: شرح class و object في Python للمبتدئين خطوة بخطوة

شرح class و object في Python للمبتدئين

بعد أن تعلمت المتغيرات، الشروط، الحلقات، الدوال، القوائم، القواميس، الملفات، والتعامل مع الأخطاء، ستبدأ بملاحظة أن بعض البرامج تجمع بيانات مرتبطة مع وظائف تعمل على تلك البيانات. مثلًا: طالب له اسم ودرجة، ومنتج له اسم وسعر، ومهمة لها عنوان وحالة.

يمكنك تمثيل هذه البيانات بقاموس أو مجموعة متغيرات عندما يكون المثال صغيرًا. لكن عندما يتوسع البرنامج وتحتاج إلى إنشاء أكثر من طالب أو منتج أو مهمة، يصبح تنظيم البيانات والعمليات داخل 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__.

الفرق بين class و object في Python مع مثال الطالب

ما هي __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 يجعل كودك مفهومًا لأي شخص يقرأه.

شرح self و init في class Python للمبتدئين

ما هي 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 متعددة دون إعادة كتابة نفس المنطق لكل كتاب.

إنشاء methods داخل class Python باستخدام مثال بيانات طالب

متى أستخدم 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 و object في Python

تمرين عملي

أنشئ 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 داخل ملفات منفصلة. وفي الوقت الحالي، راجع الدروس التي ستساعدك على فهم الأمثلة السابقة:

الخلاصة

  • الـ 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. الوراثة ستكون أوضح عندما يصبح هذا الأساس مريحًا بالنسبة لك.

إرسال تعليق

أحدث أقدم