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

### **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, стратегии тестирования.
