You are on page 1of 16

‫‪Classes‬‬

‫הכל עניין של ירושה‬

‫עומר רוזנבוים‪ ,‬שי סדובסקי‬


‫‪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‬‬
‫‪ ‬אפשר לרשת גם ממחלקות אחרות‬

‫עומר רוזנבוים‪ ,‬שי סדובסקי‬ ‫‪9‬‬


‫ירושה‬
‫‪ ‬נייצר מחלקה נוספת‪ ,‬של כלבים‪ ,‬שיורשים ממחלקת חיית מחמד‪.‬‬
‫נוסיף לכלבים את האופציה לנבוח‪:‬‬

‫‪ ‬לכלבים עדיין יש את כל התכונות שיש לכל חיית מחמד‪ ,‬רק‬


‫שצריך לכתוב הרבה פחות‪.‬‬

‫עומר רוזנבוים‪ ,‬שי סדובסקי‬ ‫‪10‬‬


‫עוד קצת על ירושה‬
‫‪ ‬אם נרצה לקחת פונקציה או תכונה ישירות מהמחלקה האם‪ ,‬נוכל‬
‫לבקש אותה בלי לתת את שמה בעזרת ‪:)(super‬‬

‫עומר רוזנבוים‪ ,‬שי סדובסקי‬ ‫‪11‬‬


‫ועוד טיפה ממש‬
‫‪ ‬אפשר לרשת מכמה מחלקות‪.‬‬

‫‪ ‬אם עשיתם את זה כנראה תכננתם לא נכון את הקוד‪ .‬להרחבה‪,‬‬


‫קראו בספר ‪ python‬באתר גבהים‪.‬‬

‫עומר רוזנבוים‪ ,‬שי סדובסקי‬ ‫‪12‬‬


‫החבאת תכונות (ופונקציות)‬
‫‪ ‬אם נרצה שתהייה לחיה תכונה מסויימת שהמשתמש פחות נגיש‬
‫אליה (תכונה מוחבאת)‪ ,‬נתן לה שם שמתחיל בקו תחתון‪:‬‬

‫‪ ‬עדיין אפשר להגיע אליה – זו קונבנציה ולא באמת חסימה של‬


‫המשתמש‬
‫עומר רוזנבוים‪ ,‬שי סדובסקי‬ ‫‪13‬‬
‫‪is, isinstance, issubclass, type‬‬
‫‪ ‬פונקציות שימושיות בהקשרי אובייקטים‪:‬‬
‫‪ – is ‬האם מדובר באותו אובייקט ממש (אותו מיקום בזיכרון?)‬
‫‪ – isinstance ‬האם האובייקט יורש מהמחלקה?‬
‫‪ – type ‬המחלקה הספציפית של האובייקט (ולא מחלקות האם)‬
‫‪ – issubclass ‬האם מחלקה אחת יורשת מהשניה?‬

‫עומר רוזנבוים‪ ,‬שי סדובסקי‬ ‫‪14‬‬


‫לסיכום‬
‫‪ ‬מחלקות זה מאוד שימושי‬
‫‪ ‬אפשר לפשט דברים‬
‫‪ ‬אפשר לחסוך בקוד‬
‫‪ ‬אפשר לתאר את הרעיון בצורה יותר אלגנטית‬
‫‪ ‬מתאים מאוד לתכנות בפייתון‬

‫עומר רוזנבוים‪ ,‬שי סדובסקי‬ ‫‪15‬‬


?‫שאלות‬
:class Question(object)
:def __init__(self, question)
self.question = question
self.answered = 0

‫ שי סדובסקי‬,‫עומר רוזנבוים‬ 16

You might also like