Python super() – Python 3 super()

Python super() функция позволяет явно обращаться к родительскому классу. Это полезно в случае наследования, когда мы хотим вызвать функции родительского класса.

Python super

Для понимания функции python super необходимо знать о Наследование в Python. В наследовании Python подклассы наследуют от суперкласса. Python super() функция позволяет нам неявно обращаться к суперклассу. Таким образом, Python super упрощает нашу задачу и делает ее более удобной. При обращении к суперклассу из подкласса нам не нужно явно указывать имя суперкласса. В следующих разделах мы обсудим функцию python super.

Пример функции python super

Сначала рассмотрим следующий код, использованный в нашем учебнике по Наследованию в 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) 

Мы можем заменить это вызовом функции супер в Python, как показано ниже.

super().__init__(student_name, student_age)

Выходные данные останутся такими же в обоих случаях, как показано на изображении ниже.

Python 3 супер

Обратите внимание, что приведенный выше синтаксис предназначен для функции супер в Python 3. Если вы используете версии Python 2.x, то он немного отличается, и вам придется внести следующие изменения:

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

Первое изменение – иметь object в качестве базового класса для Person. Это требуется для использования функции супер в версиях Python 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

Второе изменение в синтаксисе самой функции супер. Как видите, функция супер в Python 3 намного проще в использовании, и синтаксис также выглядит чище.

Супер функция Python с многоуровневым наследованием

Как мы уже упоминали ранее, функция super() в Python позволяет нам обращаться к суперклассу неявно. Но в случае многократного наследования к какому классу она будет обращаться? Что ж, функция super() в Python всегда будет обращаться к непосредственному суперклассу. Кроме того, функция super() в Python не только может обращаться к функции \_\_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)

Давайте посмотрим на вывод примера использования супер в Python 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 в Python

Если у вас есть предыдущий опыт работы с языком Java, то вы должны знать, что базовый класс там также вызывается с помощью объекта super. Таким образом, этот концепт действительно полезен для программистов. Однако в Python также сохраняется возможность для программиста использовать имя суперкласса для ссылки на них. И если ваша программа включает в себя многократное наследование, то эта функция super() вам поможет. Вот и всё о функции super в Python. Надеюсь, вы поняли эту тему. Пожалуйста, используйте поле комментариев для любых вопросов.

Вы можете ознакомиться с полным скриптом на Python и другими примерами на Python в нашем GitHub-репозитории.

Ссылка: Официальная документация

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