Jump to content

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

В компьютерном программировании утиная печать — это применение теста на уток — «Если оно ходит как утка и крякает как утка, то это, должно быть, утка» — чтобы определить, объект можно ли использовать для определенной цели. При именительной типизации объект относится к заданному типу, если он объявлен как таковой (или если связь типа с объектом выводится с помощью таких механизмов, как наследование объекта ). При утиной типизации объект относится к заданному типу, если он имеет все методы и свойства, необходимые для этого типа. [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]

См. также [ править ]

Ссылки [ править ]

  1. ^ «Глоссарий — документация Python 3.7.1» . docs.python.org . Проверено 8 ноября 2018 г.
  2. ^ «Утиная типизация на Python — пример» . Технические часы . 28.06.2020. Архивировано из оригинала 31 марта 2022 г. Проверено 26 июля 2020 г.
  3. Boo: Duck Typing. Архивировано 6 октября 2008 г., в Wayback Machine.
  4. ^ «Динамические классы и утиная типизация» .
  5. ^ «Метапрограммирование – утиное печатание на D» .
  6. ^ «SE Radio Episode 384: Борис Черный на TypeScript» . se-radio.net . Проверено 25 октября 2019 г.
  7. ^ Чаплицки, Эван. «Основной язык · Введение в Elm» . Проверено 30 января 2017 г.
  8. ^ «PEP 544 – Протоколы: Структурное подтипирование (статическая утиная типизация)» .
  9. ^ «StackOverflow: реализовать утиную типизацию с помощью Java MethodHandles» . Проверено 13 июня 2020 г.
Arc.Ask3.Ru: конец переведенного документа.
Arc.Ask3.Ru
Номер скриншота №: d8163e1cc1ae7149f6bea5d882a74789__1718660040
URL1:https://arc.ask3.ru/arc/aa/d8/89/d8163e1cc1ae7149f6bea5d882a74789.html
Заголовок, (Title) документа по адресу, URL1:
Duck typing - Wikipedia
Данный printscreen веб страницы (снимок веб страницы, скриншот веб страницы), визуально-программная копия документа расположенного по адресу URL1 и сохраненная в файл, имеет: квалифицированную, усовершенствованную (подтверждены: метки времени, валидность сертификата), открепленную ЭЦП (приложена к данному файлу), что может быть использовано для подтверждения содержания и факта существования документа в этот момент времени. Права на данный скриншот принадлежат администрации Ask3.ru, использование в качестве доказательства только с письменного разрешения правообладателя скриншота. Администрация Ask3.ru не несет ответственности за информацию размещенную на данном скриншоте. Права на прочие зарегистрированные элементы любого права, изображенные на снимках принадлежат их владельцам. Качество перевода предоставляется как есть. Любые претензии, иски не могут быть предъявлены. Если вы не согласны с любым пунктом перечисленным выше, вы не можете использовать данный сайт и информация размещенную на нем (сайте/странице), немедленно покиньте данный сайт. В случае нарушения любого пункта перечисленного выше, штраф 55! (Пятьдесят пять факториал, Денежную единицу (имеющую самостоятельную стоимость) можете выбрать самостоятельно, выплаичвается товарами в течение 7 дней с момента нарушения.)