Что такое функция 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().