במחברת השנייה שמתי לב שבמספר מחלקות יש פנייה בעזרת super אך אין מחלקת על שממנה ירשנו מלבד OBJECT כמובן.
לדוגמא:
class Clickable:
(def init(self, **kwarg
(super().init(**kwargs
מה מנסים להשיג בכך? האם בעצם כל דבר שאכניס בתצורה של prameter=somthing יהפוך לי מיד לתכונה בתוך המחלקה?
זה יעזור לנו במקרים של ירושה מרובה – יכול להיות שמחלקה Button תירש מ־Clickable ומ־LargeButton. במקרה כזה סדר הירושה יקבע, נניח, כ־Button -> Clickable -> LargeButton.
כדי לקבל גם את התכונות של ה־__init__
של LargeButton יש לנו 2 אפשרויות:
- לקרוא ב־
Button.__init__
ל־__init__
של Clickable, וגם לקרוא ל־__init__
שלLargeButton
. היתרון הוא שזה כתוב במפורש בקוד וקל לראות מיד מה זה עושה, החיסרון הוא שאם נשנה את עץ הירושה (נוסיף מחלקה, או נוריד את LargeButton לדוגמה) נצטרך לשנות אתButton.__init__
כך שישקף את המצב החדש. - לקרוא ב־Button ל־
__init__
של super, הרי הואClickable.__init__
, ולדאוג ש־Clickable.__init__
קוראת לפעולה__init__
ב־super
שלה, הרי הואLargeButton.__init__
. היתרון הוא שלא משנה מה סדר הירושה, כמה פרמטרים יועברו או אם נוסיף/נוריד מחלקות, שרשרת הקריאות הזו תתבצע אוטומטית בלי שנצטרך להוסיף או להוריד קוד.
לקריאה נוספת: https://rhettinger.wordpress.com/2011/05/26/super-considered-super/
ועדיין במקרה הזה לדוגמה, לא מובן לי למה צריך גם בLargeButton לציין super()… הרי היא המחלקה המקורית ואין לה מחלקת אם.
ואם נהפוך את סדר הירושה? ואם מחר נוסיף מחלקה אחרת שיורשת מ¯3 מחלקות, ו¯LargeButton היא השנייה? (:
הבנתי, אז לשם מניעת בעיות עתידיות עם הקוד
אני מצטרף לשאלה, אם המטרה היא להוות גמישות למחלקות כדי שהמתכנת הבא יוכל לשנות אותן לצרכים שלו, למה מלכתחילה לא לבנות את כל המחלקות בצורה הזו?
בנוסף, בנוגע ל- kwargs, בשימוש הראשון הראתם לנו שהמטרה שלהן היא להשאיר מבנה גמיש כך שאם בעתיד פונקציית האב תשתנה מחלקת הבן עדיין תוכל לקבל את כל הפרמטרים, אם כך השימוש שלה בדוגמא של הטנק היא לאפשר שכל אחת מהמחלקות תוכל להיות המחלקה היורשת ובהתאם לקבל את הפרמטרים משאר המחלקות?
ושאלה אחרונה, האם צורת הכתיבה של הפרמטרים בתוך הדוגמא:
Tank(name="Merkava Mk 4M Windbreaker", max_speed=64, strength=17.7)
ובפרט הכוונה שלכל פרמטר מצויין השם שלו מאפשרת לנו להתעלם מהסדר שבו הכנסנו את הפרמטרים? כי הרי בהגדרה של מחלקת טנק הכנסתם את מחלקת נשק ואז את מחלקת רכב, אבל סדר הפרמטרים בדוגמא הפוך - מחלקת רכב ולאחר מכן מחלקת נשק
לגבי השאלה האחרונה, הבנתי שצורת הכתיבה של הפרמטרים (ציון שמם) נועדה לנתב את הפרמטרים למחלקה הנכונה ופחות משנה הסדר. כך שאם בעתיד יוסיפו עוד פרמטרים למחלקות האב, זה לא יפריע לתקינות הקוד.
אין סיבה שלא. הרבה מוסיפים קריאות ל־super בכל ה־__init__
שלהם.
כן
מה שאפרת כתבה
מתנצל על ההקפצה, פשוט עם כל המבחנים רק עכשיו הגעתי למחברת הזו
הבנתי שאנחנו משתמשים בסופר כי אנחנו מניחים שיכולים להיות שינויים ומחלקת העל יכולה להפוך פתאום לתת מחלקה.
השאלה שלי היא כשהמחלקה עדיין נחשבת מחלקת על, איך הסופר מגיב כשאין מחלקה מעליה? הוא רואה שאין מחלקה מעליו ופשוט אומר ‘סבבה, תדלגו מעליי אז’?
במקרה הזה, כדאי תמיד לעשות סופר במחלקות, שהרי הוא לא גורע, וכדאי שיהיה ליתר ביטחון?
תמיד יש מעל מחלקה אפילו מחלקה שלא יורשת מפורשות, יורשת ממחלקת־העל
object