Duck typing (утиная типизация) — это концепция в программировании, которая позволяет определять тип объекта не по его классу или явному объявлению, а по его поведению (наличию определённых методов и свойств). Название происходит от английской поговорки:
"Если что-то выглядит как утка, плавает как утка и крякает как утка, то это, вероятно, утка."
В Python утиная типизация широко используется благодаря динамической типизации языка. Это означает, что Python не проверяет типы объектов на этапе компиляции, а вместо этого полагается на их поведение во время выполнения.
В Python объекты могут использоваться в коде, если они поддерживают необходимые методы или операции, независимо от их фактического типа. Например, если объект имеет метод quack(), его можно использовать в коде, который ожидает "утку".
class Duck:
def quack(self):
print("Quack!")
class Person:
def quack(self):
print("I'm quacking like a duck!")
def make_it_quack(thing):
thing.quack()
duck = Duck()
person = Person()
make_it_quack(duck) # Вывод: Quack!
make_it_quack(person) # Вывод: I'm quacking like a duck!
В этом примере функция make_it_quack принимает любой объект, у которого есть метод quack(). Неважно, является ли объект экземпляром класса Duck или Person. Главное — чтобы объект "умел" крякать.
В статически типизированных языках (например, Java или C#), типы объектов проверяются на этапе компиляции. Это обеспечивает безопасность, но снижает гибкость. В Python, благодаря duck typing, вы можете писать более гибкий код, но при этом нужно быть осторожным, чтобы не допустить ошибок времени выполнения.
from typing import Protocol
class Quackable(Protocol):
def quack(self) -> None:
...
def make_it_quack(thing: Quackable) -> None:
thing.quack()
duck = Duck()
person = Person()
make_it_quack(duck) # ОК
make_it_quack(person) # ОК
make_it_quack("not a duck") # Ошибка статического анализатора типов
Здесь используется Protocol из модуля typing, чтобы явно указать, что объект должен поддерживать метод quack(). Это добавляет строгости, сохраняя гибкость.
Используйте duck typing, когда вам нужна гибкость, но помните о возможных рисках и используйте аннотации типов для повышения безопасности кода.