ירושה היא שימושית, אבל אתה יכול לנצל את מלוא הפוטנציאל שלה על ידי שימוש חוזר בקוד ממחלקות בסיס.

טייק אווי מפתח

  • הפונקציה super() של Python מאפשרת לקרוא לשיטות superclass מתת-מחלקה, מה שמקל על הטמעת ירושה ועקיפה של מתודות.
  • הפונקציה super() קשורה קשר הדוק ל- Method Resolution Order (MRO) ב-Python, שקובע את הסדר שבו חיפוש מחלקות קדומות אחר מתודות או תכונות.
  • שימוש ב-super() בבוני מחלקות הוא נוהג נפוץ לאתחול תכונות נפוצות במחלקת האב וספציפיות יותר במחלקת הילד. אי שימוש ב- super() עלול להוביל להשלכות לא מכוונות, כגון אתחולי תכונות חסרים.

אחת מתכונות הליבה של Python היא פרדיגמת OOP שלה, שבה אתה יכול להשתמש כדי לדגמן ישויות בעולם האמיתי ומערכות היחסים שלהן.

כאשר עובדים עם מחלקות Python, לעתים קרובות תשתמשו בירושה ותעקפו את התכונות או השיטות של מחלקת-על. Python מספק א סוּפֶּר() פונקציה המאפשרת לקרוא לשיטות של מחלקת העל מתת המחלקה.

מה זה super() ולמה אתה צריך את זה?

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

instagram viewer
סוּפֶּר() הוא שימושי.

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

איך super() עובד?

כְּלַפֵּי פְּנִים, סוּפֶּר() קשור קשר הדוק ל צו פתרון שיטה (MRO) ב-Python, אשר אלגוריתם הליניאריזציה של C3 קובע.

הנה איך סוּפֶּר() עובד:

  1. קבע את המחלקה והמופע הנוכחיים: כשאתה מתקשר סוּפֶּר() בתוך מתודה של תת-מחלקה, Python מגלה אוטומטית את המחלקה הנוכחית (המחלקה המכילה את השיטה שקראה סוּפֶּר()) והמופע של אותה מחלקה (כלומר, עצמי).
  2. קבע את מעמד העל: סוּפֶּר() לוקח שני טיעונים - המחלקה הנוכחית והמופע - שאינך צריך להעביר במפורש. הוא משתמש במידע זה כדי לקבוע את מחלקת העל כדי להאציל את קריאת השיטה. הוא עושה זאת על ידי בחינת היררכיית המעמדות וה-MRO.
  3. הפעל את השיטה ב-Superclass: ברגע שנקבע מעמד העל, סוּפֶּר() מאפשר לך לקרוא לשיטות שלה כאילו אתה קורא להן ישירות מתת המחלקה. זה מאפשר לך להרחיב או לעקוף שיטות תוך כדי שימוש ביישום המקורי ממחלקת העל.

שימוש בסופר() ב-Class Constructor

באמצעות סוּפֶּר() ב-class constructor הוא נוהג נפוץ, מכיוון שלעתים קרובות תרצה לאתחל תכונות נפוצות בכיתת האב וספציפיות יותר אצל הילד.

כדי להדגים זאת, להגדיר מחלקה Python, אַבָּא, אשר א בֵּן הכיתה יורשת מ:

classFather:
def__init__(self, first_name, last_name):
self.first_name = first_name
self.last_name = last_name

classSon(Father):
def__init__(self, first_name, last_name, age, hobby):
# Call the parent class constructor (Father)
super().__init__(first_name, last_name)

self.age = age
self.hobby = hobby

defget_info(self):
returnf"Son's Name: {self.first_name}{self.last_name}, \
Son's Age: {self.age}, Son's Hobby: {self.hobby}"

# Create an instance of the Son class
son = Son("Pius", "Effiong", 25, "Playing Guitar")

# Access attributes
print(son.get_info())

בתוך ה בֵּן בנאי, הקריאה ל super().init() מפעיל את אַבָּא בנאי מחלקה, מעביר אותו שם פרטי ו שם משפחה בתור פרמטרים. זה מבטיח כי אַבָּא class עדיין יכול להגדיר את תכונות השם בצורה נכונה, אפילו ב-a בֵּן לְהִתְנַגֵד.

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

...
classSon(Father):
def__init__(self, first_name, last_name, age, hobby):
self.age = age
self.hobby = hobby
...

אם תנסה עכשיו להתקשר ל- לקבל מידע שיטה, היא תעלה א AttributeError בגלל ה self.first_name ו self.last_name תכונות לא אוחלו.

שימוש ב- super() ב-Class Methods

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

classFather:
defspeak(self):
return"Hello from Father"

classSon(Father):
defspeak(self):
# Call the parent class's speak method using super()
parent_greeting = super().speak()
returnf"Hello from Son\n{parent_greeting}"

# Create an instance of the Son class
son = Son()

# Call the speak method of the Son class
son_greeting = son.speak()

print(son_greeting)

ה בֵּן הכיתה יורשת מה אַבָּא ויש לו לְדַבֵּר שיטה. ה לְדַבֵּר שיטת ה בֵּן שימושים בכיתה super().speak() להתקשר ל לְדַבֵּר שיטת ה אַבָּא מעמד. זה מאפשר לו לכלול את ההודעה מכיתת האב תוך הרחבתה עם הודעה ספציפית לכיתת הילד.

נכשל בשימוש סוּפֶּר() בשיטה שעוקפת אחרת פירושה שהפונקציונליות הקיימת בשיטת האב לא תיכנס לתוקף. זה מביא להחלפה מלאה של התנהגות השיטה, מה שיכול להוביל להתנהגות שלא התכוונת.

הבנת סדר החלטה של ​​שיטה

Order Resolution Order (MRO) הוא הסדר שבו Python מחפש מחלקות קדומות כאשר אתה ניגש למתודה או לתכונה. MRO עוזר לפייתון לקבוע לאיזו שיטה לקרוא כאשר קיימות היררכיות ירושה מרובות.

classNigeria():
defculture(self):
print("Nigeria's culture")

classAfrica():
defculture(self):
print("Africa's culture")

הנה מה שקורה כשאתה יוצר מופע של לאגוס כיתה והתקשר ל תַרְבּוּת שיטה:

  1. Python מתחיל בחיפוש אחר ה תַרְבּוּת שיטה ב לאגוס הכיתה עצמה. אם הוא מוצא אותו, הוא קורא לשיטה. אם לא, הוא עובר לשלב השני.
  2. אם הוא לא מוצא את תַרְבּוּת שיטה ב לאגוס class, Python מסתכל על מחלקות הבסיס לפי סדר הופעתן בהגדרת המחלקה. במקרה הזה, לאגוס יורש ראשון מ אַפְרִיקָה ואחר כך מ ניגריה. אז, Python יחפש את תַרְבּוּת שיטה ב אַפְרִיקָה ראשון.
  3. אם הוא לא מוצא את תַרְבּוּת שיטה ב אַפְרִיקָה מחלקה, Python יחפש ב- ניגריה מעמד. התנהגות זו נמשכת עד שהיא מגיעה לסוף ההיררכיה וזורקת שגיאה אם ​​היא לא מצליחה למצוא את השיטה באף אחת ממחלקות העל.

הפלט מציג את סדר רזולוציית השיטה של לאגוס, החל משמאל לימין.

מלכודות נפוצות ושיטות עבודה מומלצות

כשעובדים עם סוּפֶּר(), יש כמה מלכודות נפוצות שכדאי להימנע מהן.

  1. שים לב לצו החלטת השיטה, במיוחד בתרחישי ירושה מרובים. אם אתה צריך להשתמש בירושה מורכבת מרובה, אתה צריך להכיר את אלגוריתם ליניאריזציה C3 שבו Python משתמש כדי לקבוע MRO.
  2. הימנע מתלות מעגלית בהיררכיית הכיתה שלך, מה שעלול להוביל להתנהגות בלתי צפויה.
  3. תעד את הקוד שלך בצורה ברורה, במיוחד בעת שימוש סוּפֶּר() בהיררכיות מחלקות מורכבות, כדי שיהיה מובן יותר עבור מפתחים אחרים.

השתמש בסופר() בדרך הנכונה

של פייתון סוּפֶּר() פונקציה היא תכונה רבת עוצמה כאשר אתה עובד עם ירושה ועקוף שיטה. להבין איך סוּפֶּר() עובד וביצוע שיטות עבודה מומלצות יאפשרו לך ליצור קוד בר-תחזוקה ויעיל יותר בפרויקטים של Python שלך.