פייתון super() – פייתון 3 super()

לפונקציה super() ב-Python מאפשרת לנו להתייחס באופן ישיר למחלקה האב. זה שימושי במקרים של ירושה כאשר אנו רוצים לקרוא לפונקציות של מחלקת ההורית.

פונקציה super ב-Python

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

דוגמה על פונקציה super ב-Python

בתחילה, בודקים את הקוד הבא שהוצג במדריך שלנו על ירושה ב-Python. בדוגמה זו, מחלקת ההורית הייתה Person ומחלקת הבניה הייתה Student. לכן, הקוד מוצג למטה.

class Person:
    # אתחול המשתנים
    name = ""
    age = 0

    # הגדרת בנאי
    def __init__(self, person_name, person_age):
        self.name = person_name
        self.age = person_age

        # הגדרת שיטות המחלקה

    def show_name(self):
        print(self.name)

    def show_age(self):
        print(self.age)


# תחילת הגדרת התת-מחלקה
class Student(Person):
    studentId = ""

    def __init__(self, student_name, student_age, student_id):
        Person.__init__(self, student_name, student_age)
        self.studentId = student_id

    def get_id(self):
        return self.studentId  # returns the value of student id


# סיום הגדרת התת-מחלקה


# יצירת אובייקט של המחלקה האב
person1 = Person("Richard", 23)
# קריאה לשיטות החבר של האובייקט
person1.show_age()
# יצירת אובייקט של התת-מחלקה
student1 = Student("Max", 22, "102")
print(student1.get_id())
student1.show_name()

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

Person.__init__(self, student_name, student_age) 

נוכל להחליף זאת בקריאה לפונקציה super של פייתון כך:

super().__init__(student_name, student_age)

הפלט יישאר זהה בשני המקרים, כפי שמוצג בדימוי למטה.

פייתון 3 super

שימו לב שהתחברות המערכת מתייחסת לפונקציית super של פייתון 3. אם אתם משתמשים בגרסאות 2.x של פייתון, יהיה עליכם לבצע שינויים מעטים ולבצע את השינויים הבאים:

class Person(object):
...
        super(Student, self).__init__(student_name, student_age)

השינוי הראשון הוא להשתמש ב־object כמחלקת הבסיס של Person. יש להשתמש בפונקציית super בגרסאות 2.x של פייתון. אחרת, ייתכן ותקבלו את השגיאה הבאה.

Traceback (most recent call last):
  File "super_example.py", line 40, in <module>
    student1 = Student("Max", 22, "102")
  File "super_example.py", line 25, in __init__
    super(Student, self).__init__(student_name, student_age)
TypeError: must be type, not classobj

השינוי השני הוא בתחברות המערכת לפונקציית super עצמה. כפי שאתם רואים, פונקציית super של פייתון 3 היא הרבה יותר קלה לשימוש והתחברותיה גם נראית יותר נקיה.

פונקציית super של פייתון עם ירושה מרובה רמות

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

class A:
    def __init__(self):
        print('Initializing: class A')

    def sub_method(self, b):
        print('Printing from class A:', b)


class B(A):
    def __init__(self):
        print('Initializing: class B')
        super().__init__()

    def sub_method(self, b):
        print('Printing from class B:', b)
        super().sub_method(b + 1)


class C(B):
    def __init__(self):
        print('Initializing: class C')
        super().__init__()

    def sub_method(self, b):
        print('Printing from class C:', b)
        super().sub_method(b + 1)


if __name__ == '__main__':
    c = C()
    c.sub_method(1)

בואו נראה את תוצאת דוגמה הפייתון 3 הבאה עם ירושה מרובה.

Initializing: class C
Initializing: class B
Initializing: class A
Printing from class C: 1
Printing from class B: 2
Printing from class A: 3

כך, מתוך התוצאה אנו רואים בבירור שהפונקציה __init__() של המחלקה C נקראה תחילה, לאחר מכן מחלקה B ואחר כך מחלקה A. משהו דומה קרה בקריאה לפונקציה sub_method().

למה אנו צריכים פונקציית super של פייתון

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

תוכל לבדוק את הקובץ המלא של סקריפט Python ודוגמאות נוספות ב-מאגר ה-GitHub שלנו.

התייחסות: תיעוד רשמי

Source:
https://www.digitalocean.com/community/tutorials/python-super