Функция super() в Python
avatar
7 | (offline)
❤️‍🔥Notehunter Developer
Добавлено:
Категория: Основы «Python»
Комментариев: 0

Что такое функция super()

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

В Python Inheritance подклассы наследуются от суперкласса. 

Функция super() позволяет нам неявно ссылаться на суперкласс. Так эта функция делает нашу задачу проще и удобнее. При обращении к суперклассу подкласса нам не нужно явно писать имя суперкласса.

Пример функции super()

Давайте посмотрим на пример наследуемого класса:

class Car:

    def __init__(self, name, horsepower):
        self.name = name
        self.horsepower = horsepower

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

    def show_horsepower(self):
        print(self.horsepower)


class Cargo(Car):

    def __init__(self, name, horsepower, carrying):
        Car.__init__(self, name, horsepower)
        self.carrying = carrying

    def show_carrying(self):
        print(self.carrying)


# Create an object of the superclass
car1 = Car('Chevrolet Camaro', 238)
# call member methods of the objects
car1.show_name()
car1.show_horsepower()
# Create an object of the subclass
cargocar1 = Cargo('Mercedes-Benz Actros', 408 , 7600)
cargocar1.show_horsepower()
cargocar1.show_name()
cargocar1.show_carrying()

В приведенном выше примере мы вызвали функцию родительского класса, как:

Car.__init__(self, name, horsepower)

Но мы можем использовать super()

super().__init__(name, horsepower)

Результат будет один и тот же:

Chevrolet Camaro
238
408
Mercedes-Benz Actros
7600

функция 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)

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

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, Основы Python, super(),
Комментарии к статье 0
Комментариев нет
Форма добавления комментария (необходима регистрация)