طَبِّقْهاتعلّم المبدأ، وطبّقه بيدكمقرر 111 · أساسيات برمجة الحاسب
الدرس 23 · الوحدة 5: البرمجة الشيئية

دالة البناء __init__

نجعل الكائن يأخذ كل بياناته لحظة صنعه. ⏱ نحو 20 دقيقة.

__init__name = ...id = ...
بعد هذا الدرس ستستطيع أن:
  • تشرح فائدة دالة البناء __init__.
  • تكتب __init__ بمُعطيات وتحفظها في self.
  • تستخدم الخصائص في دوال الكلاس.
  • تضع الكائنات في قائمة وتمرّ عليها.

١مشكلة الخصائص المنسية

في الدرس السابق أضفنا الخصائص بعد صنع الكائن، سطرًا سطرًا. وإذا نسينا خاصية ظهر خطأ:

main.py
class Student:    pass s = Student()s.name = "علي"print(s.name, s.mark)
Shell×
>>> %Run main.py
Traceback (most recent call last):
File "main.py", line 6, in <module>
print(s.name, s.mark)
AttributeError: 'Student' object has no attribute 'mark'
>>>

الحل: نجعل الكائن يأخذ كل خصائصه لحظة صنعه، مثل بطاقة الطالب التي لا تُصرف إلا مكتملة.

٢دالة البناء __init__

__init__ دالة خاصة تُنفَّذ تلقائيًّا عند صنع كل كائن. نكتب فيها الخصائص، ونعطيها القيم بين قوسي الكلاس:

🔎 تتبّع: صنع كائن بدالة البناء
main.py
class Student:    def __init__(self, name, mark):        self.name = name        self.mark = mark s = Student("سارة", 90)print(s.name, s.mark)
Variables · المتغيّرات في الذاكرة
Shell×

انتبه: قبل init وبعدها شرطتان سفليتان __، لا شرطة واحدة.

٣الخصائص مع الدوال

بعد أن تُحفظ الخصائص في self، تستطيع كل دوال الكلاس استخدامها:

main.py
class Student:    def __init__(self, name, mark):        self.name = name        self.mark = mark     def result(self):        if self.mark >= 60:            return "ناجح"        return "راسب"     def show(self):        print(self.name, ":", self.mark, "-", self.result()) a = Student("علي", 75)b = Student("منى", 48)a.show()b.show()
Shell×
>>> %Run main.py
علي : 75 - ناجح
منى : 48 - راسب
>>>

٤قائمة من الكائنات

نستطيع وضع الكائنات في قائمة، والمرور عليها بحلقة كما تعلّمت:

main.py
class Product:    def __init__(self, name, price):        self.name = name        self.price = price cart = [Product("قلم", 3), Product("دفتر", 7), Product("حقيبة", 45)]total = 0for p in cart:    total += p.priceprint("الإجمالي:", total)
Shell×
>>> %Run main.py
الإجمالي: 55
>>>
📎 للاستزادة (اختياري): قيمة ابتدائية ثابتة

بعض الخصائص لا تحتاج قيمة من الخارج، فنكتب قيمتها مباشرة داخل __init__:

main.py
class Account:    def __init__(self, owner):        self.owner = owner        self.balance = 0 a = Account("خالد")print(a.owner, a.balance)
Shell×
>>> %Run main.py
خالد 0
>>>

توقّع وتحقّق

متى تُنفَّذ __init__؟

تعمل لحظة صنع الكائن.

def __init__(self, name, age): كيف نصنع الكائن؟

نعطي قيمتي name و age فقط.

أي سطر يحفظ الاسم في الكائن داخل __init__؟

self.الخاصية = القيمة.

كم شرطة سفلية قبل init وبعدها؟

__init__

الخلاصة

تحدٍّ برمجي: كلاس الكتاب

متوسط

اكتب كلاسًا اسمه Book تأخذ دالة بنائه العنوان title وعدد الصفحات pages، وفيه دالة info تطبع العنوان وعدد الصفحات. اصنع كتابين واستدعِ info لكل منهما.

المطلوب:
  • def __init__(self, title, pages):
  • احفظ القيمتين في self.
  • دالة info تطبع: self.title و self.pages

ابدأ من هذا الكود، واضغط ▶ شغّل هنا لتكتب حلّك وتجرّبه مباشرة:

main.py
class Book:    def __init__(self, title, pages):
المطلوب×
البرمجة 120
الشبكات 200
💡 تلميح 1
self.title = title
💡 تلميح 2
b1 = Book("البرمجة", 120)

حاول بنفسك أولًا؛ للمسألة أكثر من حلّ صحيح.

main.py
class Book:    def __init__(self, title, pages):        self.title = title        self.pages = pages     def info(self):        print(self.title, self.pages) b1 = Book("البرمجة", 120)b2 = Book("الشبكات", 200)b1.info()b2.info()
انتقل إلى تقييم الدرساختيار من متعدد، وصح وخطأ، وأكمل الفراغ، وتتبّع الناتج.ابدأ التقييم ←