1 תכנות מונחה עצמים כשאנחנו כותבים תכנית גדולה אנחנו רוצים: ◦ לפשט את התכנית שלנו – לא לשכפל קוד ◦ לפשט את התכנות ,להעביר רעיון בקלות ◦ לייצר סדר ומבניות http://webmaster.org.il/articles/csharp-oop-intro
תכנות מונחה עצמים
קוד שמסודר במבנים קבועים שעונים על צורך:
עומר רוזנבוים ,שי סדובסקי 2
class ,class או מחלקה ,היא הדרך לממש את ה'עצם' ,או הטיפוס ( ,)typeבעזרת פייתון. בשיעור הזה נכתוב מחלקה של חיית מחמד .נתחיל מהגדרת המחלקה:
סוגריים – :objectמחלקה מיוחדת שמגדירה את כל
האובייקטים בפייתון .נתעמק בהמשך.
עומר רוזנבוים ,שי סדובסקי 3
הפעלת המחלקה כעת ,נרצה לייצר את חיית המחמד הראשונה .אין לה אף תכונות, ובכל זאת נייצר שתיים .נשים לב שהן שונות ,ונמצאות במקומות שונים בזכרון:
עומר רוזנבוים ,שי סדובסקי 4
הוספת תכונות חיות המחמד שלנו משעממות .נרצה לתת לכל חיית מחמד גיל, שיהיה 0כשנייצר אותן. נרשום בפונקציה פנימית ,בשם השמור __ ,__initשהיא פונקציית ה.constructor- init נקראת בכל פעם שאנחנו מייצרים instanceשל המחלקה. init חייבת לקבל את הארגומנט ,selfשמסמל את האובייקט שהמחלקה תייצר.
עומר רוזנבוים ,שי סדובסקי 5
הוספת תכונות אולי נוכל לתת לחיה גם שם? נאפשר למשתמש לאתחל את חיית המחמד ולתת לה שם.
עומר רוזנבוים ,שי סדובסקי 6
פונקציות נאפשר לחיית המחמד לבצע פעולות ,כשהבסיסית שבהן היא לגדול! נממש פונקציה שכזו ,אחרי הפונקציה :init
עומר רוזנבוים ,שי סדובסקי 7
-Slotים מה אם נרצה להדפיס את חיית המחמד או להשוות אותה לחיה אחרת? לשם כך קיימים -slotים ,שהם שמות שמורים למתודות שנשתמש בהן אחר כך בסינטקס של פייתון. הדפסה __repr__ - גדול מ __gt__ -
?מה לא טוב פה
עומר רוזנבוים ,שי סדובסקי 8
ירושה עד עכשיו ירשנו כל מיני תכונות ממחלקה בשם ,objectלמרות שלא אמרנו זאת מפורשות. למעשה ,כל מחלקה וכל טיפוס בפייתון יורשים מ:object-
זה בגלל שפייתון היא שפה מונחית עצמים.
למעשה ,אנחנו יורשים תכונות בסיסיות של השפה כשאנחנו קוראים למחלקה .object אפשר לרשת גם ממחלקות אחרות
לכלבים עדיין יש את כל התכונות שיש לכל חיית מחמד ,רק
שצריך לכתוב הרבה פחות.
עומר רוזנבוים ,שי סדובסקי 10
עוד קצת על ירושה אם נרצה לקחת פונקציה או תכונה ישירות מהמחלקה האם ,נוכל לבקש אותה בלי לתת את שמה בעזרת :)(super
עומר רוזנבוים ,שי סדובסקי 11
ועוד טיפה ממש אפשר לרשת מכמה מחלקות.
אם עשיתם את זה כנראה תכננתם לא נכון את הקוד .להרחבה,
קראו בספר pythonבאתר גבהים.
עומר רוזנבוים ,שי סדובסקי 12
החבאת תכונות (ופונקציות) אם נרצה שתהייה לחיה תכונה מסויימת שהמשתמש פחות נגיש אליה (תכונה מוחבאת) ,נתן לה שם שמתחיל בקו תחתון:
עדיין אפשר להגיע אליה – זו קונבנציה ולא באמת חסימה של
המשתמש עומר רוזנבוים ,שי סדובסקי 13 is, isinstance, issubclass, type פונקציות שימושיות בהקשרי אובייקטים: – is האם מדובר באותו אובייקט ממש (אותו מיקום בזיכרון?) – isinstance האם האובייקט יורש מהמחלקה? – type המחלקה הספציפית של האובייקט (ולא מחלקות האם) – issubclass האם מחלקה אחת יורשת מהשניה?
עומר רוזנבוים ,שי סדובסקי 14
לסיכום מחלקות זה מאוד שימושי אפשר לפשט דברים אפשר לחסוך בקוד אפשר לתאר את הרעיון בצורה יותר אלגנטית מתאים מאוד לתכנות בפייתון