# super()

Функция `super()` в Python используется для вызова методов родительского или родственного класса.

**Назначение**:

* Получить доступ к методам и свойствам родительского или родственного класса.
* Обеспечить корректную работу с множественным наследованием.

**Возврат**:

* Возвращает объект-прокси, который делегирует вызовы методов родительскому или родственному классу.

**Описание**:

* Может быть вызвана без аргументов в методах класса (Python 3).
* В Python 2 и в некоторых случаях в Python 3 может принимать два аргумента:
  1. `type` - тип объекта, для которого ищется родительский класс.
  2. `object` - объект, относительно которого ищется родительский класс.
* Используется для вызова конструкторов, методов и доступа к свойствам родительских классов.

**Примеры**:

1. _**Вызов конструктора родительского класса**_
2. _**Переопределение метода с использованием super()**_
3. _**Использование с множественным наследованием**_

{% tabs %}
{% tab title="1." %}
```python
class Parent:
    def __init__(self, name):
        self.name = name

class Child(Parent):
    def __init__(self, name, age):
        super().__init__(name)
        self.age = age

child = Child("Alice", 10)
print(child.name, child.age)  # Выведет: Alice 10
```
{% endtab %}

{% tab title="2." %}
```python
class Animal:
    def speak(self):
        return "Some sound"

class Dog(Animal):
    def speak(self):
        return super().speak() + " and Woof!"

dog = Dog()
print(dog.speak())  # Выведет: Some sound and Woof!
```
{% endtab %}

{% tab title="3." %}
```python
class A:
    def method(self):
        print("A method")

class B(A):
    def method(self):
        print("B method")
        super().method()

class C(A):
    def method(self):
        print("C method")
        super().method()

class D(B, C):
    def method(self):
        print("D method")
        super().method()

D().method()
# Выведет:
# D method
# B method
# C method
# A method
```
{% endtab %}
{% endtabs %}

**Использование**:

* Для вызова методов родительского класса при их переопределении.
* В конструкторах для инициализации родительской части объекта.
* При работе с множественным наследованием для корректного вызова методов всех родительских классов.
* Для доступа к свойствам и методам родительских классов без явного указания их имен.

Функция `super()` является мощным инструментом в объектно-ориентированном программировании на Python. Она позволяет эффективно работать с иерархией классов, особенно в случаях множественного наследования.

Важно понимать, что `super()` не всегда обращается к непосредственному родительскому классу. В случае множественного наследования она следует порядку разрешения методов (Method Resolution Order, MRO), который определяет порядок поиска методов в иерархии классов.

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