OOP – תכנות מונחה עצמים מערך שיעור למרצה

מערך שיעור: Class, Object ו-Instance

משך: יום לימוד מלא — 6 שעות אקדמיות (270 דקות).

מטרת השיעור: הסטודנטים יבינו למה OOP קיים (לפני איך), ויבנו מודל מנטלי יציב של Class כתבנית, Object כמופע, ו-self כ"האובייקט הזה".

בסוף השיעור הסטודנטים צריכים:

  1. להסביר באנלוגיה משלהם את ההבדל בין Class ל-Object, ולזהות את הבעיות של קוד פרוצדורלי שמצדיקות OOP.
  2. לכתוב Class עם __init__, Instance Attributes, ולידציה בסיסית, ומתודות (Getter ו-Setter).
  3. להסביר שלב אחר שלב מה קורה ב-obj = Class(args) וב-obj.method(x), כולל מאיפה מגיע self.

דגש קריטי: לא למהר. זה השבוע החשוב בקורס. עדיף שכל הכיתה תבין לעומק את self ואת __init__ מאשר להגיע למתודות מתקדמות. self הוא נקודת התקיעה הגדולה, ולכן להקדיש לו זמן, ציורים וחזרות.


מהלך השיעור

חלק בשיעורמשךהערות ודגשים
למה OOP?45 דק'לכתוב יחד את מערכת הבנק הפרוצדורלית, ואז “לשבור” אותה (balance שלילי, שגיאת כתיב, סוג חשבון חדש). רק אחרי זה, הרעיון.
Class ו-Object35 דק'Class ריקה, יצירת אובייקטים, type, is. הוספת Attributes מבחוץ, והבעיה שזה יוצר.
הפסקה15 דק'
__init__ ו-self55 דק'אנלוגיית טופס ההרשמה. לכתוב על הלוח את 5 השלבים של Student("Dana", 24). Student, Product, Person.
Methods ו-__str__50 דק'obj.m(x) ≡ Class.m(obj, x) על הלוח. BankAccount מלא, “המערכת מהבוקר, פתורה”.
הפסקה15 דק'
תרגול + Mini Project45 דק'מערכת מלאי. לעבור ולבדוק שכולם משתמשים ב-self. נכון.
בדוק את עצמך10 דק'

דגשים להעברת השיעור

  • “למה” לפני “איך”. לא לכתוב class לפני שהסטודנטים הרגישו את הבעיה בקוד פרוצדורלי. זה עיקרון ה-Self-Learning של כל הקורס.
  • אנלוגיה אחת עקבית: תבנית ייצור מכוניות (Class) מול מכונית ספציפית (Object). לחזור אליה לאורך כל השבוע.
  • self בציור: לצייר את ה-Class כ"תבנית" אחת, ושלושה אובייקטים. כשקוראים dana.add_grade(90), לצייר חץ מ-self אל האובייקט של דנה. לחזור על זה עם אבי.
  • להראות את מה ש-Python עושה בפועל: להריץ מול הכיתה Student.add_grade(dana, 90). זה עובד, וזה “מסיר את הקסם” מ-self.
  • שגיאות ההודעה “takes 2 positional arguments but 3 were given” — להפיק אותה בכוונה ולפענח יחד. כל סטודנט ייתקל בה השבוע.
  • לא להכניס עדיין Class Attributes, Encapsulation או Inheritance. אם נשאלים, “מחר” / “בנושא ירושה ופולימורפיזם”.
  • Dunder methods: להציג רק __init__ ו-__str__. לא להיכנס ל-__repr__ ושאר הקסמים.

מושגים

מושגהסבר קצר
OOPתכנות שמארגן קוד סביב אובייקטים: נתונים + פעולות.
Procedural Programmingנתונים ופונקציות בנפרד.
Classתבנית שמגדירה סוג חדש. שם ב-PascalCase.
Object / Instanceדבר ספציפי שנוצר מ-Class.
Instantiationיצירת Object מ-Class: Class().
Attributeנתון ששייך לאובייקט: obj.name.
Instance AttributeAttribute שמוגדר עם self.x ושונה בכל אובייקט.
__init__ / Constructorמתודה שרצה אוטומטית ביצירה ומאתחלת את האובייקט.
selfהאובייקט הנוכחי. פרמטר ראשון בכל מתודה, ו-Python מעבירה אותו.
Methodפונקציה בתוך Class שפועלת על האובייקט.
Stateערכי ה-Attributes של אובייקט ברגע נתון.
Getter / Setterמתודה שמחזירה ערך / מתודה שמשנה מצב.
Dunder / __str__מתודה מיוחדת עם __ / ייצוג טקסטואלי ל-print.

תרגיל חשיבה

שאלת פתיחה (תחילת היום, לפני כל קוד): “אתם צריכים לכתוב מערכת לניהול חשבונות בנק ל-10,000 לקוחות. ביום הראשון יש רק הפקדה ומשיכה. בחודש הבא מוסיפים חשבון חיסכון עם ריבית. בעוד חצי שנה, חשבון עסקי עם מסגרת אשראי. איך תארגנו את הקוד כך שלא יהפוך לסלט?”

מהלך:

  1. לתת לכיתה 5 דקות לתכנן בזוגות בלי OOP: dicts ופונקציות.
  2. לאסוף תכנונים. לשאול: “מה מונע מקוד אחר לשנות balance ישירות? איפה רשום מה ‘חייב’ להיות בחשבון? מה קורה ל-withdraw כשמגיע סוג חשבון שלישי ורביעי?”
  3. לכתוב יחד את הגרסה הפרוצדורלית, ולשבור אותה ב-3 דרכים מול הכיתה.
  4. רק אז להציג את הרעיון: “מה אם החשבון עצמו היה יודע מה מותר לו?”

מה המרצה מראה בסוף: את אותה מערכת כ-BankAccount (משיעור המתודות), זו לצד זו עם הגרסה הפרוצדורלית, ולסמן בצבע: נתונים (Attributes), כללים (בדיקות בתוך המתודות), פעולות (Methods). ולהשאיר על הלוח את המשפט: “Object = נתונים + ההתנהגות שמגינה עליהם.” (בנושא ירושה ופולימורפיזם לחזור לשאלה של חשבון החיסכון, כשמגיעים ל-Inheritance.)