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