Ответ
Утиная типизация (duck typing) — это ключевая концепция в Python, согласно которой тип или класс объекта менее важен, чем методы, которые он реализует. Принцип гласит: "Если нечто ходит как утка и крякает как утка, то это утка".
Другими словами, вместо проверки, является ли объект экземпляром конкретного класса (например, isinstance(obj, Duck)
), код просто пытается вызвать у него нужный метод (например, obj.quack()
). Если метод существует и работает, объект считается подходящим.
Практический пример:
Функция process_sound
ожидает любой объект с методом make_sound()
.
class Duck:
def make_sound(self):
print("Quack!")
class Car:
def make_sound(self):
print("Vroom!")
class Person:
def speak(self):
print("Hello!")
def process_sound(thing):
# Мы не проверяем тип 'thing'. Мы просто доверяем,
# что у него есть метод .make_sound()
try:
thing.make_sound()
except AttributeError:
print(f"Объект {type(thing).__name__} не умеет издавать звук")
duck = Duck()
car = Car()
person = Person()
process_sound(duck) # Вывод: Quack!
process_sound(car) # Вывод: Vroom!
process_sound(person) # Вывод: Объект Person не умеет издавать звук
Преимущества и риски:
- Гибкость: Позволяет писать более универсальный и слабосвязанный код. Разные, не связанные иерархией наследования классы могут использоваться в одной и той же функции.
- Риск: Ошибки проявляются только во время выполнения (
AttributeError
), если объекту передали без нужного метода. Статические анализаторы типов, такие какmypy
, помогают отлавливать такие проблемы на этапе разработки с помощью протоколов (typing.Protocol
).