# Примеры полиморфизма

**Пример полиморфизма на основе метода:**

```python
class Dog:
    def sound(self):
        return "Woof!"

class Cat:
    def sound(self):
        return "Meow!"

def make_sound(animal):
    return animal.sound()

my_dog = Dog()
my_cat = Cat()

print(make_sound(my_dog))  # Вывод: Woof!
print(make_sound(my_cat))  # Вывод: Meow!
```

Здесь метод `sound` у каждого класса (`Dog` и `Cat`) имеет одно и то же имя, что позволяет использовать их полиморфно в функции `make_sound`.

**Пример полиморфизма на основе класса:**

```python
class Shape:
    def area(self):
        pass

class Circle(Shape):
    def __init__(self, radius):
        self.radius = radius

    def area(self):
        return 3.14 * self.radius ** 2

class Rectangle(Shape):
    def __init__(self, length, width):
        self.length = length
        self.width = width

    def area(self):
        return self.length * self.width

def calculate_area(shape):
    return shape.area()

circle = Circle(5)
rectangle = Rectangle(4, 6)

print(calculate_area(circle))  # Вывод: 78.5
print(calculate_area(rectangle))  # Вывод: 24
```

Здесь полиморфизм проявляется в том, что оба объекта (`Circle` и `Rectangle`) могут быть использованы в функции `calculate_area`, несмотря на разные классы.

**Пример полиморфизма на основе переменной:**

```python
class Car:
    def fuel_efficiency(self):
        return 20  # Мили на галлон

class Bicycle:
    def fuel_efficiency(self):
        return "N/A"  # Велосипед не использует топливо

def print_fuel_efficiency(vehicle):
    print(f"Fuel efficiency: {vehicle.fuel_efficiency()} MPG")

my_car = Car()
my_bicycle = Bicycle()

print_fuel_efficiency(my_car)  # Вывод: Fuel efficiency: 20 MPG
print_fuel_efficiency(my_bicycle)  # Вывод: Fuel efficiency: N/A MPG
```

В этом примере полиморфизм основан на переменной `vehicle`, которая может ссылаться как на объект класса `Car`, так и на объект класса `Bicycle`. Обе переменные вызывают метод `fuel_efficiency` полиморфно.
