# Статический полиморфизм (перегрузка методов) и Динамический полиморфизм (переопределение методов):

### **1. Статический полиморфизм (перегрузка методов)**

* В классических языках (Java, C++) — это **методы с одинаковым именем, но разными параметрами** (типами или количеством).
* В Python **нет полноценной перегрузки**, потому что метод определяется по имени, и новый метод с тем же именем **перезапишет старый**.
* Но мы можем имитировать перегрузку с помощью **значений по умолчанию** или `*args, **kwargs`.

```python
class Calculator:
    def add(self, a, b=0, c=0):
        return a + b + c

calc = Calculator()
print(calc.add(5))       # 5
print(calc.add(5, 10))   # 15
print(calc.add(5, 10, 15)) # 30
```

📌 Python делает это через **гибкие сигнатуры** функций, а не через строгую типовую перегрузку.

***

### **2. Динамический полиморфизм (переопределение методов)**

* Это **один интерфейс — разные реализации**.
* Работает через наследование и переопределение методов.
* Какой именно метод будет вызван — решается **во время выполнения (runtime)**.

```python
class Shape:
    def area(self):
        raise NotImplementedError

class Circle(Shape):
    def __init__(self, r):
        self.r = r
    def area(self):
        return 3.14 * self.r * self.r

class Square(Shape):
    def __init__(self, a):
        self.a = a
    def area(self):
        return self.a * self.a

shapes = [Circle(5), Square(4)]
for s in shapes:
    print(s.area())  # Python сам выберет метод в runtime
```

***

### **Главные отличия**

| Характеристика | Статический полиморфизм                                      | Динамический полиморфизм                |
| -------------- | ------------------------------------------------------------ | --------------------------------------- |
| Определяется   | Во время компиляции (в Python — имитация через параметры)    | Во время выполнения программы           |
| Основан на     | Разных сигнатурах методов                                    | Переопределении методов в наследниках   |
| В Python       | Эмулируется через `*args`, `**kwargs`, значения по умолчанию | Обычное наследование и override методов |

***

💡 В **автотестах**:

* **Статический** — часто для утилитарных методов (логирование, генерация тестовых данных, парсеры).
* **Динамический** — для Page Object Model, API clients, стратегии тестирования.


---

# 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/staticheskii-polimorfizm-peregruzka-metodov-i-dinamicheskii-polimorfizm-pereopredelenie-metodov.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.
