> For the complete documentation index, see [llms.txt](https://kaze.gitbook.io/qa-theory/llms.txt). Markdown versions of documentation pages are available by appending `.md` to page URLs; this page is available as [Markdown](https://kaze.gitbook.io/qa-theory/osnovy-programmirovaniya-na-python/super.md).

# 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, расширении утилит и построении иерархий классов в автотестах**.
