Иногда есть необходимость в использовании родительского метода внутри дочернего класса.
Сделать это можно, используя метод 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 нужен в том случае, если у родительского класса и дочернего есть одинаковые по названию методы и нам надо, что отработал именно метод родительского класса, а не дочернего!
Документация по этому методу находится здесь.