Какова особенность языка в том, что некоторые виды классов определены с точки зрения наличия некоторых методов со специальными именами?

Это вопрос концепции языка программирования, например аналогично уровню прагматики языка программирования Скотта.

В Python классы некоторых типов объектов определены с точки зрения наличия некоторых методов со специальными именами, например,

  1. класс дескрипторов определяется как класс, у которого есть метод с именем __get__, __set__ или __delete__().
  2. класс итераторов определяется как класс, у которого есть метод с именем __next__.

Вопросы:

  1. Какая функция языка Python называется при проектировании языков программирования? Это утка печатает?
  2. Как работает языковая функция внизу?
  3. В C ++, C # и Java правильно ли, что класс дескриптора и класс итератора были бы определены как подклассы некоторых конкретных классов? (аналогично интерфейсу C # IDisposable)

    В Python

    • Можно ли определить классы дескрипторов как подклассы какого-то определенного класса?

    • Можно ли определить классы итераторов как подклассы какого-то конкретного класса?


person Tim    schedule 17.09.2017    source источник
comment
класс итераторов определяется как класс, у которого есть метод с именем __next__. Это неверно или, по крайней мере, плохо сформулировано. Итератор - это объект, у которого есть функция __next__. Класс итератора не имеет значения; это утиная печать.   -  person Aran-Fey    schedule 17.09.2017


Ответы (3)


Какая функция языка Python называется при проектировании языков программирования? Это утка печатает?

«Здесь может работать любой объект с членом с определенным именем (или подписью)» - это утиный ввод. Я не думаю, что есть более конкретный термин для «любой объект с членом с определенным именем (или подписью), может работать для этой языковой функции», если это то, о чем вы спрашивали.

Как работает языковая функция внизу?

Я не понимаю вопроса. Если языковая функция означает, что она вызывает метод с определенным именем, она вызывает метод с этим именем. Вот и все.

В C ++, C # и Java правильно ли, что класс дескриптора и класс итератора были бы определены как подклассы некоторых конкретных классов?

Я не знаю ничего похожего на дескриптор ни на одном из этих языков, и я не думаю, что имеет смысл размышлять о том, как бы он выглядел, если бы существовал.

Что касается итераторов, у каждого из этих языков есть цикл foreach, поэтому вы можете посмотреть на это:

В C ++ цикл for на основе диапазона работает с любым типом, который имеет члены экземпляра begin и end или для которого существуют функции begin и end. Возвращаемый тип должен поддерживать операторы ++, != и *.

В C # цикл foreach работает с любым типом, имеющим метод экземпляра GetEnumerator(), который возвращает тип с методом MoveNext() и свойством Current. Также есть интерфейс IEnumerable<T>, описывающий ту же форму. Перечислимые типы обычно реализуют этот интерфейс, но это не обязательно.

В Java расширенный цикл for работает с любым типом, реализующим Iterable.

Таким образом, нигде нет подклассов (C # и Java различают реализацию интерфейса и наследование от базового класса). Java требует от вас реализации интерфейса. C # использует утиную типизацию, но также позволяет реализовать интерфейс. C ++ использует утиную типизацию, интерфейса или базового класса нет вообще.

Обратите внимание, что в зависимости от языка решение об использовании утиной печати для определенной языковой функции может быть сложным. В качестве крайнего примера, одна функция C # (инициализаторы коллекций) требует реализации определенного интерфейса (IEnumerable), а также наличия метода с определенным именем (Add). Таким образом, эта функция частично набрана с утиным типом.

person svick    schedule 17.09.2017

Вам нужен термин Модель данных Python (об этом чем просто dunder-методы и -attributes, но они являются его неотъемлемой частью).

person timgeb    schedule 17.09.2017

Это аспект утиного набора.

Python, как язык с динамической типизацией, меньше заботится о фактических типах объектов, чем об их поведении. Как говорится, если крякает, как утка, то, наверное, утка; в случае вашего дескриптора Python просто хочет знать, что он определяет специальные методы, и если да, то принимает, что это дескриптор.

person Daniel Roseman    schedule 17.09.2017