# super()

### **1. Что такое `super()`**

* `super()` возвращает **родительский (базовый) класс текущего класса**.
* Позволяет **вызывать методы родителя** без явного указания имени класса.
* Часто используется для расширения поведения родительских методов при наследовании.

***

### **2. Синтаксис**

```python
class Child(Parent):
    def method(self):
        super().method()  # вызов метода родителя
```

* В Python 3 достаточно `super()` без аргументов.
* В Python 2 нужно было указывать класс и self: `super(Child, self).method()`

***

### **3. Примеры использования**

#### **Пример 1: Расширение метода родителя**

```python
class Animal:
    def speak(self):
        print("Animal speaks")

class Dog(Animal):
    def speak(self):
        super().speak()   # вызов метода родителя
        print("Dog barks")

dog = Dog()
dog.speak()
# Output:
# Animal speaks
# Dog barks
```

#### **Пример 2: Инициализация родительского конструктора**

```python
class Person:
    def __init__(self, name):
        self.name = name

class Employee(Person):
    def __init__(self, name, position):
        super().__init__(name)  # инициализация родителя
        self.position = position

e = Employee("Alice", "QA Engineer")
print(e.name, e.position)  # Alice QA Engineer
```

#### **Пример 3: В множественном наследовании**

```python
class A:
    def show(self):
        print("A")

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

class C(B):
    def show(self):
        print("C")
        super().show()

c = C()
c.show()
# Output:
# C
# B
# A
```

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

***

### **4. Применение в автотестах**

* **Page Object Model**: наследование базового класса страницы

```python
class BasePage:
    def open(self, url):
        print(f"Opening {url}")

class LoginPage(BasePage):
    def open(self, url):
        super().open(url)  # вызов базового метода
        print("Filling login form")

page = LoginPage()
page.open("https://example.com/login")
```

* **Расширение утилитарных методов**:

```python
class Logger:
    def log(self, msg):
        print(f"[LOG]: {msg}")

class TestLogger(Logger):
    def log(self, msg):
        super().log(msg)
        print(f"[TEST LOG]: {msg}")

logger = TestLogger()
logger.log("Step 1 completed")
```

***

💡 **Вывод:**

* `super()` позволяет **вызывать методы родительских классов**, расширять их поведение и корректно работать с наследованием, особенно в **множественном наследовании**.
* Очень полезен в **Page Object Model, расширении утилит и построении иерархий классов в автотестах**.


---

# Agent Instructions: Querying This Documentation

If you need additional information that is not directly available in this page, you can query the documentation dynamically by asking a question.

Perform an HTTP GET request on the current page URL with the `ask` query parameter:

```
GET https://kaze.gitbook.io/qa-theory/osnovy-programmirovaniya-na-python/super.md?ask=<question>
```

The question should be specific, self-contained, and written in natural language.
The response will contain a direct answer to the question and relevant excerpts and sources from the documentation.

Use this mechanism when the answer is not explicitly present in the current page, you need clarification or additional context, or you want to retrieve related documentation sections.
