Ответ
Полиморфизм — это принцип ООП, который позволяет использовать единый интерфейс для объектов разных классов. В Python он ярко проявляется благодаря "утиной типизации" (duck typing) и перегрузке операторов.
1. Утиная типизация (Duck Typing)
Основная идея: "Если это выглядит как утка, плавает как утка и крякает как утка, то это, вероятно, и есть утка". Тип объекта не важен, важно лишь наличие у него необходимых методов или атрибутов.
Встроенная функция len()
— отличный пример. Она работает с любым объектом, у которого есть метод __len__()
:
print(len("hello")) # 5 (строка)
print(len([1, 2, 3])) # 3 (список)
print(len({"a": 1, "b": 2})) # 2 (словарь)
2. Перегрузка операторов (Operator Overloading)
Это позволяет классам определять собственное поведение для стандартных операторов, таких как +
, -
, *
.
Например, оператор +
работает по-разному для чисел, строк и списков. Мы можем определить его и для нашего класса, реализовав "магический" метод __add__()
.
class Vector:
def __init__(self, x, y):
self.x = x
self.y = y
# Определяем поведение для оператора +
def __add__(self, other):
if isinstance(other, Vector):
return Vector(self.x + other.x, self.y + other.y)
raise TypeError("Unsupported operand type for +")
def __repr__(self):
return f"Vector({self.x}, {self.y})"
v1 = Vector(1, 2)
v2 = Vector(3, 4)
# Наш класс теперь поддерживает операцию сложения
result = v1 + v2
print(result) # Вывод: Vector(4, 6)