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, когда вам нужна гибкость, но помните о возможных рисках и используйте аннотации типов для повышения безопасности кода.