› كل الدروس
الدرس 12 من 12 30 دقيقة

Objects و Classes

اصنع data type من عندك

الفكرة باختصار

class قالب بتصمّمه بنفسك. object نسخة شغّالة من القالب ده، ليها بياناتها و functions بتاعتها.

بعد الدرس ده هتعرف

  • تفهم الفرق بين class و object
  • تعمل class فيه بيانات و functions
  • تفهم __init__ و self
  • تعرف إمتى تستخدم class وإمتى dictionary يكفي
1

شوف الفكرة الأول

قبل أي code — افهم بيحصل إيه

2

الشرح

فكرة واحدة في كل خطوة

1

المشكلة

عايز تمثّل طالب. عنده اسم ودرجات ومتوسط.

بـ dictionary: {"name": "Abdelrahman", "grades": [90, 85]}. تمام.

بس بعدين هتحتاج function تحسب المتوسط، و function تقول ناجح ولا لأ... وهتفضل تبعت dictionary لـ functions دي كل مرة.

class بيجمّع البيانات و functions اللي بتشتغل عليها في حتة واحدة.

2

class قالب، object نسخة

فكّر في استمارة التسجيل في الجامعة:

الاستمارة الفاضية = class. فيها الخانات، مفيهاش بيانات.
الاستمارة المليانة باسمك = object. نسخة مليانة.

من استمارة واحدة بتطلّع آلاف النسخ، وكل واحدة فيها بيانات طالب مختلف.

المحاكاة خطوة خطوة بتدعم Python الأساسية بس. عشان كده في الدرس ده، الأمثلة والتمارين بتشتغل على Python حقيقي في متصفحك — دوس «شغّل فعلاً» وشوف الناتج بنفسك.

3

أبسط class

1class Student:
2 def __init__(self, name):
3 self.name = name
4
5s1 = Student("Abdelrahman")
6print(s1.name) # Abdelrahman


class Student: — بنعرّف القالب. الاسم بيبدأ بحرف كبير (عُرف متفق عليه).

__init__ — function خاصة بتشتغل تلقائيًا أول ما تعمل object جديد. شغلتها تجهّز البيانات الأولية.

self — بتشاور على object الحالي. self.name = name معناها «خزّن الاسم ده جوّه object ده».

4

self — النقطة اللي بتلخبط الكل

كل function جوّه class لازم أول parameter فيها يكون self.

ليه؟ لأن function واحدة مشتركة بين كل objects. self هي اللي بتقولها «إنت شغّالة على نسخة مين دلوقتي؟».

ولاحظ: لما بتنادي s1.greet()، مش بتبعت self — Python بتبعت s1 تلقائيًا.

1class Student:
2 def __init__(self, name):
3 self.name = name
4
5 def greet(self):
6 print(f"I am {self.name}")
7
8s1 = Student("Abdelrahman")
9s1.greet() # I am Abdelrahman
5

كل object له بياناته

لو عملت اتنين objects من نفس class، كل واحد ليه نسخة مستقلة من البيانات.

1s1 = Student("Abdelrahman")
2s2 = Student("Mona")
3print(s1.name) # Abdelrahman
4print(s2.name) # Mona


تغيير s1 مش بيأثر على s2 خالص. دي الفايدة الكبيرة.

6

class كامل

1class Student:
2 def __init__(self, name):
3 self.name = name
4 self.grades = []
5
6 def add_grade(self, g):
7 self.grades.append(g)
8
9 def average(self):
10 if len(self.grades) == 0:
11 return 0
12 return sum(self.grades) / len(self.grades)
13
14 def passed(self):
15 return self.average() >= 60
16
17s = Student("Abdelrahman")
18s.add_grade(90)
19s.add_grade(70)
20print(s.average()) # 80.0
21print(s.passed()) # True


شوف الجمال: البيانات و functions اللي بتشتغل عليها في مكان واحد.

7

إمتى تستخدم class؟

استخدم class لما:
· عندك بيانات و functions بتشتغل عليها مع بعض
· هتعمل كذا نسخة من نفس الشكل
· الكيان ليه «سلوك» مش بيانات بس

dictionary يكفي لما:
· بيانات بس من غير سلوك
· حاجة مؤقتة وبسيطة

ما تعقّدش الدنيا من غير داعي. class لطالب فيه اسم بس = مبالغة.

8

__str__ — خلّي object يقدّم نفسه

لو طبعت object من غير تجهيز، هتلاقي حاجة زي <__main__.Book object at 0x7f...> — مفيدة للكمبيوتر، مش ليك.

عرّف function اسمها __str__ ترجّع string، و Python هتستخدمها كل ما حد يطبع object.

لازم return مش print — function بتسلّم string لـ Python وهي اللي بتطبعه.

Python
1class Book:
2 def __init__(self, title, pages):
3 self.title = title
4 self.pages = pages
5
6 def __str__(self):
7 return f"{self.title} ({self.pages} pages)"
8
9b = Book("Python from Scratch", 420)
10print(b)
الناتج
Python from Scratch (420 pages)
9

object بيحمي قواعده

أهم فايدة عملية لـ class: القاعدة بتعيش جنب البيانات.

لو الرصيد مينفعش ينزل تحت الصفر، الفحص ده بيتحط جوّه withdraw — مش في كل مكان بينادي عليها.

كده مستحيل حد ينسى الفحص، لأنه مش شغلته أصلاً.

Python
1class Account:
2 def __init__(self, owner, balance=0):
3 self.owner = owner
4 self.balance = balance
5
6 def withdraw(self, amount):
7 if amount > self.balance:
8 return False
9 self.balance -= amount
10 return True
11
12a = Account("Abdelrahman", 500)
13print(a.withdraw(200), a.balance)
14print(a.withdraw(900), a.balance)
الناتج
True 300
False 300
10

inheritance — class بيبني على class

لو عندك اتنين classes فيهم 90% نفس الكلام، مش هتكرّره. بتعمل class أساسي، و classes التانية بترث منه.

class Student(Person): معناها «الطالب هو شخص، وزيادة».

بيورث كل البيانات و functions، وتقدر تضيف عليه أو تغيّر اللي عايزه.

الموضوع ده أكبر من الدرس ده بكتير — بس المهم تعرف إنه موجود وإيه فكرته.

Python
1class Person:
2 def __init__(self, name):
3 self.name = name
4
5 def hello(self):
6 return f"I am {self.name}"
7
8class Student(Person):
9 def hello(self):
10 return f"I am {self.name}, an IT student"
11
12print(Person("Mona").hello())
13print(Student("Karim").hello())
الناتج
I am Mona
I am Karim, an IT student
3

وده كمان شوفه متحرك

الفكرة دي أسهل ما تتشاف من ما تتقرا

4

أمثلة محلولة

شوف إزاي بنفكّر قبل ما نكتب

مثال 1

أول class — قالب ونسختين

المطلوب: اعمل class Student فيه اسم، وطلّع منه طالبين.

نفكّر إزاي؟

  1. 1class بتعرّف القالب — لسه مفيش طالب
  2. 2__init__ بتشتغل تلقائيًا مع كل نسخة جديدة
  3. 3self.name = name بتخزّن الاسم جوّه النسخة دي
مثال 2

بيانات + functions في حتة واحدة

المطلوب: ضيف للطالب درجات، و function بتحسب متوسطه و function بتقول ناجح ولا لأ.

نفكّر إزاي؟

  1. 1الدرجات بتبدأ list فاضية جوّه __init__
  2. 2كل function أول parameter فيها self عشان توصل لبيانات النسخة
  3. 3functions بتنادي بعضها بـ self.average()
مثال 3

كل object له حالته

المطلوب: اعمل عدّاد، وطلّع منه نسختين، وشوف كل واحدة بتعدّ لوحدها.

نفكّر إزاي؟

  1. 1__init__ بتبدأ العدّاد من صفر في كل نسخة
  2. 2self.n += 1 بتعدّل بيانات النسخة دي بس
  3. 3النسختين مستقلّين تمامًا
مثال 4

خلّي object يطبع نفسه

المطلوب: اعمل class Book واطبعه مباشرة بـ print بشكل مفهوم.

نفكّر إزاي؟

  1. 1print(obj) من غير تجهيز بتطبع حاجة وحشة زي <__main__.Book object at 0x...>
  2. 2function الخاصة __str__ بتقول «اطبعني كده»
  3. 3لازم ترجّع string
مثال 5

list من objects

المطلوب: اعمل تلات طلبة في list، واطبع الناجحين وعددهم.

نفكّر إزاي؟

  1. 1list من objects = جدول بيانات
  2. 2في loop بوصل لبيانات كل object بالنقطة
  3. 3نفس منطق الفلترة اللي اتعلمناه — بس على objects
مثال 6

object بيحمي بياناته

المطلوب: اعمل class حساب بنكي يمنع السحب لو الرصيد مش كافي.

نفكّر إزاي؟

  1. 1الفحص جوّه function نفسها — مش مسؤولية اللي بينادي
  2. 2return بدري بتوقّف العملية
  3. 3value الافتراضية balance=0 بتخلّي النداء أسهل
5

ورقة مراجعة

ارجعلها وإنت بتحل — مش محتاج تحفظها

كل حاجة عن classes
الحاجةمعناهامثالالناتج
class Name:عرّف قالبclass Student:لسه مفيش object
Name(...)اعمل object جديدs = Student("Abdelrahman")نسخة شغّالة
__init__بتشتغل تلقائيًا مع كل objectdef __init__(self, n):بتجهّز البيانات
selfobject الحاليself.name = nخزّن جوّه النسخة
obj.attrبيانات objects.nameAbdelrahman
obj.method()function بتاعة objects.average()80.0
أول parameterدايمًا self في functions بتاعة classdef add(self, g):إلزامي
__str__شكل object وقت الطباعةreturn f"{self.title}"print(b) بقى مفهوم
value افتراضيةزي أي functiondef __init__(self, b=0):ينفع من غيرها
class ولا dictionary؟بيانات + سلوك → classبيانات بس → dictionaryما تعقّدش
6

نفس الفكرة بالأدوات اللي اتعلمناها

شوفه بيشتغل سطر سطر

شغّل code خطوة خطوة

قبل ما تتعلم classes، ده إزاي كنا هنعمل نفس الحاجة. لاحظ إن functions منفصلة عن البيانات — class بيلمّهم.

1def make_student(name):◂
2 return {"name": name, "grades": []}
3
4def add_grade(student, g):
5 student["grades"].append(g)
6
7def average(student):
8 gs = student["grades"]
9 if len(gs) == 0:
10 return 0
11 return sum(gs) / len(gs)
12
13s = make_student("Abdelrahman")
14add_grade(s, 90)
15add_grade(s, 70)
16print(s["name"], "→", average(s))
17print("passed" if average(s) >= 60 else "failed")
الذاكرة

لسه مفيش variables

الناتج على الشاشة
لسه ما اتطبعش حاجة…
1

عرّفنا function make_student(name) — لسه ما اشتغلتش، بس بقت جاهزة

خطوة 123 خطوة
Python الحقيقيCPython 3.14

المحاكاة فوق بتشرحلك خطوة خطوة. دوس هنا عشان تشغّل نفس code على Python حقيقي وتتأكد بنفسك.
أول مرة هيحمّل ~11 ميجا — بعد كده بيبقى فوري.

7

غلطات بتحصل كتير

شوفها هنا بدل ما تضيّع ساعة فيها

غلط
class Student:
    def greet():
        print("hi")
صح
class Student:
    def greet(self):
        print("hi")

كل function في class لازم أول parameter فيها self.

غلط
def __init__(self, name):
    name = name
صح
def __init__(self, name):
    self.name = name

من غير self. variable بيعيش جوّه function بس وبيختفي.

غلط
s1 = Student()
# __init__ needs name
صح
s1 = Student("Abdelrahman")

لازم تبعت values اللي __init__ طالباها.

8

مسائل سريعة

فكّر الأول — بعدين اكشف

1

إيه الفرق بين class و object؟

2

إمتى __init__ بتشتغل؟

1s = Student("Abdelrahman")
3

ليه ده بيطلّع error؟

1class S:
2 def greet():
3 print("hi")
4

إيه الفرق بين السطرين؟

1self.name = name
2name = name
5

كام object هنا؟

1a = Counter()
2b = Counter()
3c = a
6

إزاي توصل لبيانات object؟

1s = Student("Abdelrahman")
7

إيه فايدة __str__؟

8

إمتى dictionary يكفي؟

9

جرّب بنفسك

اكتب code — ده الجزء اللي بيعلّم فعلاً

جرّب بنفسك

بالأدوات اللي اتعلمناها (dictionary + functions): اعمل function بتبني سجل كتاب فيه عنوان وعدد صفحات، و function بتقول الكتاب طويل (أكتر من 300 صفحة) ولا لأ.

شغّل code خطوة خطوة
1def make_book(title, pages):
2 # write here
3
4
الذاكرة

لسه مفيش variables

الناتج على الشاشة
لسه ما اتطبعش حاجة…

IndentationError: expected an indented block

بعد النقطتين (:) لازم السطر اللي بعدها يبقى مزاح لجوّه ٤ مسافات.

خطوة 1خطوة واحدة
Python الحقيقيCPython 3.14

المحاكاة فوق بتشرحلك خطوة خطوة. دوس هنا عشان تشغّل نفس code على Python حقيقي وتتأكد بنفسك.
أول مرة هيحمّل ~11 ميجا — بعد كده بيبقى فوري.

تمرين إضافي 2
جرّب بنفسك

اكتب class Rectangle فيه طول وعرض، و اتنين functions: area() و perimeter(). اعمل منه مستطيل واطبع الاتنين.

اكتب code وشغّلهبره المحاكاة
Python الحقيقيCPython 3.14

التمرين ده محتاج حاجات بره المحاكاة. اكتب code بتاعك فوق ودوس عشان يشتغل على Python حقيقي.
أول مرة هيحمّل ~11 ميجا — بعد كده بيبقى فوري.

تمرين إضافي 3
جرّب بنفسك

اكتب class Timer فيه عدّاد يبدأ من صفر، و functions tick() و reset()، و function __str__ تعرض العدّاد.

اكتب code وشغّلهبره المحاكاة
Python الحقيقيCPython 3.14

التمرين ده محتاج حاجات بره المحاكاة. اكتب code بتاعك فوق ودوس عشان يشتغل على Python حقيقي.
أول مرة هيحمّل ~11 ميجا — بعد كده بيبقى فوري.

تمرين إضافي 4
جرّب بنفسك

اكتب class Cart (عربة تسوّق) فيه list أصناف فاضية، و functions add(name, price) و total() و count(). جرّبه بصنفين.

اكتب code وشغّلهبره المحاكاة
Python الحقيقيCPython 3.14

التمرين ده محتاج حاجات بره المحاكاة. اكتب code بتاعك فوق ودوس عشان يشتغل على Python حقيقي.
أول مرة هيحمّل ~11 ميجا — بعد كده بيبقى فوري.

10

اختبر نفسك

كل إجابة معاها السبب

1

ليه code ده بيطلّع error؟

1class S:
2 def greet():
3 print("hi")
4
5S().greet()
2

كام object اتعمل هنا؟

1a = Counter()
2b = Counter()
3c = a
3

إيه فايدة __str__؟

4

إيه الفرق بين class و object؟

5

إمتى __init__ بتشتغل؟

6

إيه معنى self؟

7

إمتى dictionary يكفي بدل class؟

خلصت الدرس؟

علّم عليه عشان تعرف إنت وصلت لفين لما ترجع تاني.