Утка печатает
Типовые системы |
---|
Общие понятия |
Основные категории |
Второстепенные категории |
В компьютерном программировании утиная печать — это применение теста на уток — «Если оно ходит как утка и крякает как утка, то это, должно быть, утка» — чтобы определить, объект можно ли использовать для определенной цели. При именительной типизации объект относится к заданному типу, если он объявлен как таковой (или если связь типа с объектом выводится с помощью таких механизмов, как наследование объекта ). При утиной типизации объект относится к заданному типу, если он имеет все методы и свойства, необходимые для этого типа. [1] [2] Утиную типизацию можно рассматривать как основанную на использовании структурную эквивалентность между данным объектом и требованиями типа.
Пример [ править ]
Этот простой пример в Python 3 демонстрирует, как любой объект может использоваться в любом контексте, пока он не будет использован способом, который он не поддерживает.
class Duck:
def swim(self):
print("Duck swimming")
def fly(self):
print("Duck flying")
class Whale:
def swim(self):
print("Whale swimming")
for animal in [Duck(), Whale()]:
animal.swim()
animal.fly()
Выход:
Duck swimming
Duck flying
Whale swimming
AttributeError: 'Whale' object has no attribute 'fly'
Если предположить, что все, что умеет плавать, является уткой, поскольку утки умеют плавать, то кита можно считать уткой; однако, если также предположить, что утка должна быть способна летать, кит не будет считаться уткой.
В статически типизированных языках [ править ]
В некоторых статически типизированных языках, таких как Boo [3] и Д , [4] [5] Проверка типа класса может выполняться во время выполнения, а не во время компиляции.
Сравнение с другими системами типов [ править ]
Системы структурных типов [ править ]
Утиная типизация похожа на структурную типизацию , но отличается от нее . Структурная типизация — это статическая система типизации , которая определяет совместимость и эквивалентность типов по структуре типа, тогда как утиная типизация является динамической и определяет совместимость типов только по той части структуры типа, к которой осуществляется доступ во время выполнения .
Типскрипт , [6] Вяз [7] и Питон [8] языки в разной степени поддерживают структурную типизацию.
Протоколы и интерфейсы [ править ]
Протоколы и интерфейсы предоставляют возможность явно объявить, что некоторые методы, операторы или поведения должны быть определены. Если сторонняя библиотека реализует класс, который нельзя изменить, клиент не может использовать его экземпляр с интерфейсом, неизвестным этой библиотеке, даже если класс удовлетворяет требованиям к интерфейсу. Распространенным решением этой проблемы является шаблон адаптера . Напротив, при утином наборе объект будет принят напрямую, без необходимости использования адаптера.
Шаблоны или общие типы [ править ]
Шаблонные (также называемые универсальными ) функции или методы применяют утиный тест в контексте статической типизации ; это раскрывает все преимущества и недостатки статической и динамической проверки типов . Утиная типизация также может быть более гибкой, поскольку должны быть реализованы только те методы, которые действительно вызываются во время выполнения, в то время как шаблоны требуют реализации всех методов, недостижимость которых не может быть доказана во время компиляции.
В таких языках, как Java, Scala и Objective-C, отражение может использоваться для проверки того, реализуют ли объекты методы или добавляют ли необходимые методы во время выполнения. Например, . таким образом можно использовать Java MethodHandle API [9]
См. также [ править ]
Ссылки [ править ]
- ^ «Глоссарий — документация Python 3.7.1» . docs.python.org . Проверено 8 ноября 2018 г.
- ^ «Утиная типизация на Python — пример» . Технические часы . 28.06.2020. Архивировано из оригинала 31 марта 2022 г. Проверено 26 июля 2020 г.
- ↑ Boo: Duck Typing. Архивировано 6 октября 2008 г., в Wayback Machine.
- ^ «Динамические классы и утиная типизация» .
- ^ «Метапрограммирование – утиное печатание на D» .
- ^ «SE Radio Episode 384: Борис Черный на TypeScript» . se-radio.net . Проверено 25 октября 2019 г.
- ^ Чаплицки, Эван. «Основной язык · Введение в Elm» . Проверено 30 января 2017 г.
- ^ «PEP 544 – Протоколы: Структурное подтипирование (статическая утиная типизация)» .
- ^ «StackOverflow: реализовать утиную типизацию с помощью Java MethodHandles» . Проверено 13 июня 2020 г.