Метод super в Python

Иногда есть необходимость в использовании родительского метода внутри дочернего класса.
Сделать это можно, используя метод super() в Python.

Все дело в том, что если в дочернем классе мы называем метод точно так же, как он назван в родительском, то этот метод перекрывает собой роботу родительского метода, и как следствие, выполнится только метод дочернего класса!

class Hello:
    def __init__(self):
        print("Hello!")

class Hello_World(Hello):
    def __init__(self):
        super().__init__()
        print("World!")

hello_world = Hello_World()

А теперь запишем следующее и выполним код:

class Class1:
    var = 20

    def __init__(self):
        self.var = 10

class Class2(Class1):
    def __init__(self):
        print(self.var)
        super().__init__()
        print(self.var)
        print(super().var)


hello_world = Class2()

Но почему результат именно такой?
■ Поскольку мы переопределили init(), то аналогичный метод родительского класса ничего не передал, а интерпретатор нашел переменную var со значением 20 на уровне атрибута класса.
■ С помощью метода super() мы вызвали конструктор родительского класса, добавив таким образом атрибут var со значением 10.
■ Метод super() работает только с областью видимости класса: когда он находит соответствующую переменную на этом уровне, выводит ее на экран.
Но как работает этот метод с несколькими классами, где каждый происходит от предыдущего? Запишеми выполним следующий код

class Grandparent:
    def about(self):
        print("I am GrandParent")

    def about_myself(self):
        print("I am Grandparent")

class Parent(Grandparent):
    def about_myself(self):
        print("I am Parent")

class Child(Parent):
    def __init__(self):
        super().about()
        super().about_myself()

nick = Child()

Метод super в Python сперва ищет данные в родительском классе, а при их отсутствии переходит на уровень выше.

Подведем итого: метод super в Python нужен в том случае, если у родительского класса и дочернего есть одинаковые по названию методы и нам надо, что отработал именно метод родительского класса, а не дочернего!

Документация по этому методу находится здесь.

Рейтинг
( Пока оценок нет )
Понравилась статья? Поделиться с друзьями:
Добавить комментарий

;-) :| :x :twisted: :smile: :shock: :sad: :roll: :razz: :oops: :o :mrgreen: :lol: :idea: :grin: :evil: :cry: :cool: :arrow: :???: :?: :!: