סופר דופר....מחלקת על

במחברת השנייה שמתי לב שבמספר מחלקות יש פנייה בעזרת super אך אין מחלקת על שממנה ירשנו מלבד OBJECT כמובן.
לדוגמא:
class Clickable:
(def init(self, **kwarg
(super().init(**kwargs
מה מנסים להשיג בכך? האם בעצם כל דבר שאכניס בתצורה של prameter=somthing יהפוך לי מיד לתכונה בתוך המחלקה?

לייק 1

זה יעזור לנו במקרים של ירושה מרובה – יכול להיות שמחלקה Button תירש מ־Clickable ומ־LargeButton. במקרה כזה סדר הירושה יקבע, נניח, כ־Button -> Clickable -> LargeButton.
כדי לקבל גם את התכונות של ה־__init__ של LargeButton יש לנו 2 אפשרויות:

  1. לקרוא ב־Button.__init__ ל־__init__ של Clickable, וגם לקרוא ל־__init__ של LargeButton. היתרון הוא שזה כתוב במפורש בקוד וקל לראות מיד מה זה עושה, החיסרון הוא שאם נשנה את עץ הירושה (נוסיף מחלקה, או נוריד את LargeButton לדוגמה) נצטרך לשנות את Button.__init__ כך שישקף את המצב החדש.
  2. לקרוא ב־Button ל־__init__ של super, הרי הוא Clickable.__init__, ולדאוג ש־Clickable.__init__ קוראת לפעולה __init__ ב־super שלה, הרי הוא LargeButton.__init__. היתרון הוא שלא משנה מה סדר הירושה, כמה פרמטרים יועברו או אם נוסיף/נוריד מחלקות, שרשרת הקריאות הזו תתבצע אוטומטית בלי שנצטרך להוסיף או להוריד קוד.

לקריאה נוספת: https://rhettinger.wordpress.com/2011/05/26/super-considered-super/

4 לייקים

ועדיין במקרה הזה לדוגמה, לא מובן לי למה צריך גם בLargeButton לציין super()… הרי היא המחלקה המקורית ואין לה מחלקת אם.

ואם נהפוך את סדר הירושה? ואם מחר נוסיף מחלקה אחרת שיורשת מ¯3 מחלקות, ו¯LargeButton היא השנייה? (:

לייק 1

הבנתי, אז לשם מניעת בעיות עתידיות עם הקוד :slight_smile:

אני מצטרף לשאלה, אם המטרה היא להוות גמישות למחלקות כדי שהמתכנת הבא יוכל לשנות אותן לצרכים שלו, למה מלכתחילה לא לבנות את כל המחלקות בצורה הזו?

בנוסף, בנוגע ל- kwargs, בשימוש הראשון הראתם לנו שהמטרה שלהן היא להשאיר מבנה גמיש כך שאם בעתיד פונקציית האב תשתנה מחלקת הבן עדיין תוכל לקבל את כל הפרמטרים, אם כך השימוש שלה בדוגמא של הטנק היא לאפשר שכל אחת מהמחלקות תוכל להיות המחלקה היורשת ובהתאם לקבל את הפרמטרים משאר המחלקות?

ושאלה אחרונה, האם צורת הכתיבה של הפרמטרים בתוך הדוגמא:

Tank(name="Merkava Mk 4M Windbreaker", max_speed=64, strength=17.7)

ובפרט הכוונה שלכל פרמטר מצויין השם שלו מאפשרת לנו להתעלם מהסדר שבו הכנסנו את הפרמטרים? כי הרי בהגדרה של מחלקת טנק הכנסתם את מחלקת נשק ואז את מחלקת רכב, אבל סדר הפרמטרים בדוגמא הפוך - מחלקת רכב ולאחר מכן מחלקת נשק

לגבי השאלה האחרונה, הבנתי שצורת הכתיבה של הפרמטרים (ציון שמם) נועדה לנתב את הפרמטרים למחלקה הנכונה ופחות משנה הסדר. כך שאם בעתיד יוסיפו עוד פרמטרים למחלקות האב, זה לא יפריע לתקינות הקוד.

לייק 1

אין סיבה שלא. הרבה מוסיפים קריאות ל־super בכל ה־__init__ שלהם.

כן

מה שאפרת כתבה

לייק 1

מתנצל על ההקפצה, פשוט עם כל המבחנים רק עכשיו הגעתי למחברת הזו
הבנתי שאנחנו משתמשים בסופר כי אנחנו מניחים שיכולים להיות שינויים ומחלקת העל יכולה להפוך פתאום לתת מחלקה.
השאלה שלי היא כשהמחלקה עדיין נחשבת מחלקת על, איך הסופר מגיב כשאין מחלקה מעליה? הוא רואה שאין מחלקה מעליו ופשוט אומר ‘סבבה, תדלגו מעליי אז’?
במקרה הזה, כדאי תמיד לעשות סופר במחלקות, שהרי הוא לא גורע, וכדאי שיהיה ליתר ביטחון?

תמיד יש מעל מחלקה :slight_smile: אפילו מחלקה שלא יורשת מפורשות, יורשת ממחלקת־העל object

2 לייקים