stringtranslate.com

Утка печатает

В компьютерном программировании утиная печать — это применение теста на уток — «Если оно ходит как утка и крякает как утка, то это, должно быть, утка» — чтобы определить, можно ли использовать объект для определенной цели. При именительной типизации объект относится к заданному типу, если он объявлен как таковой (или если связь типа с объектом выводится с помощью таких механизмов, как наследование объекта ). При утиной типизации объект относится к заданному типу, если он имеет все методы и свойства, необходимые для этого типа. [1] [2] Утиную типизацию можно рассматривать как основанную на использовании структурную эквивалентность между данным объектом и требованиями типа.

Пример

Этот простой пример в Python 3 демонстрирует, как любой объект может использоваться в любом контексте, пока он не будет использован способом, который он не поддерживает.

класс  Утка : защита  плавания ( сам ): распечатать ( «Утка плавает» ) защита  летать ( сам ): распечатать ( «Утка летит» )класс  Кит : защита  плавания ( сам ): распечатать ( «Плавание китов» )для  животного  в  [ Утка (),  Кит ()]: животное . плавать () животное . летать ()

Выход:

Утка плавает Утка летает Плавает кит AttributeError: объект «Кит» не имеет атрибута «летать»

Если предположить, что все, что умеет плавать, является уткой, поскольку утки умеют плавать, то кита можно считать уткой; однако, если также предположить, что утка должна быть способна летать, кит не будет считаться уткой.

В статически типизированных языках

В некоторых статически типизированных языках, таких как Boo [3] и D , [4] [5] проверка типа класса может выполняться во время выполнения, а не во время компиляции.

Сравнение с системами других типов

Системы структурного типа

Утиная типизация похожа на структурную типизацию , но отличается от нее . Структурная типизация — это статическая система типизации , которая определяет совместимость и эквивалентность типов по структуре типа, тогда как утиная типизация является динамической и определяет совместимость типов только по той части структуры типа, к которой осуществляется доступ во время выполнения .

Языки TypeScript , [ 6] Elm [7] и Python [8] в разной степени поддерживают структурную типизацию.

Протоколы и интерфейсы

Протоколы и интерфейсы предоставляют возможность явно объявить, что некоторые методы, операторы или поведения должны быть определены. Если сторонняя библиотека реализует класс, который нельзя изменить, клиент не может использовать его экземпляр с интерфейсом, неизвестным этой библиотеке, даже если класс удовлетворяет требованиям к интерфейсу. Распространенным решением этой проблемы является шаблон адаптера . Напротив, при утином наборе объект будет принят напрямую, без необходимости использования адаптера.

Шаблоны или универсальные типы

Шаблонные (также называемые универсальными ) функции или методы применяют утиный тест в контексте статической типизации ; это раскрывает все преимущества и недостатки статической и динамической проверки типов . Утиная типизация также может быть более гибкой, поскольку должны быть реализованы только те методы, которые действительно вызываются во время выполнения, в то время как шаблоны требуют реализации всех методов, недостижимость которых не может быть доказана во время компиляции.

В таких языках, как Java, Scala и Objective-C, отражение может использоваться для проверки того, реализуют ли объекты методы или добавляют ли необходимые методы во время выполнения. Например, таким образом можно использовать Java MethodHandle API. [9]

Смотрите также

Рекомендации

  1. ^ «Глоссарий — документация Python 3.7.1» . docs.python.org . Проверено 8 ноября 2018 г.
  2. ^ «Ввод текста на Python Duck - пример» . Технические часы . 28.06.2020. Архивировано из оригинала 31 марта 2022 г. Проверено 26 июля 2020 г.
  3. Boo: Duck Typing. Архивировано 6 октября 2008 г. в Wayback Machine .
  4. ^ «Динамические классы и утиная печать» .
  5. ^ "Метапрограммирование - утиное печатание буквой D" .
  6. ^ "Эпизод 384 SE Radio: Борис Черный на TypeScript" . se-radio.net . Проверено 25 октября 2019 г.
  7. ^ Чаплицки, Эван. «Основной язык · Введение в Elm» . Проверено 30 января 2017 г.
  8. ^ «PEP 544 - Протоколы: Структурное подтипирование (статическая утиная типизация)» .
  9. ^ «StackOverflow: реализация утиной печати с использованием Java MethodHandles» . Проверено 13 июня 2020 г.