Поиск по сайту:

Супер Python() - Супер Python 3()


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

питон супер

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

Пример суперфункции Python

Сначала просто взгляните на следующий код, который мы использовали в нашем руководстве по наследованию Python. В этом примере кода надклассом был Person, а подклассом — Student. Итак, код показан ниже.

class Person:
    # initializing the variables
    name = ""
    age = 0

    # defining constructor
    def __init__(self, person_name, person_age):
        self.name = person_name
        self.age = person_age

        # defining class methods

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

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


# definition of subclass starts here
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


# end of subclass definition


# Create an object of the superclass
person1 = Person("Richard", 23)
# call member methods of the objects
person1.show_age()
# Create an object of the subclass
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)

питон 3 супер

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

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

Первое изменение заключается в том, чтобы использовать object в качестве базового класса для Person. Необходимо использовать функцию super в версиях 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 позволяет нам неявно ссылаться на суперкласс. Но в случае многоуровневого наследования к какому классу он будет относиться? Ну, Python super() всегда будет ссылаться на непосредственный суперкласс. Также функция Python 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)

Давайте посмотрим на вывод приведенного выше суперпримера 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( ) функция.

Зачем нам нужна суперфункция Python

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

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

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