Подтвердить что ты не робот

Почему динамические языки, такие как Ruby и Python, не имеют концепции интерфейсов, таких как Java или С#?

К моему удивлению, поскольку я проявляю больше интереса к динамическим языкам, таким как Ruby и Python. Утверждение состоит в том, что они ориентированы на объекты на 100%, но поскольку я читаю несколько основных понятий, таких как интерфейсы, перегрузка методов, перегрузка операторов отсутствует. Это как-то встроено под крышкой или эти языки просто не нужны? Если последнее верно, то они 100% объектно ориентированы?

EDIT: на основании некоторых ответов я вижу, что перегрузка доступна как в Python, так и в Ruby, это имеет место в Ruby 1.8.6 и Python 2.5.2??

4b9b3361

Ответ 1

Благодаря позднему связыванию они не нужны. В Java/С# интерфейсы используются, чтобы объявить, что некоторый класс имеет определенные методы, и он проверяется во время компиляции; в Python проверяется, существует ли метод во время выполнения.

Перегрузка метода в Python работает:

>>> class A:
...  def foo(self):
...    return "A"
...
>>> class B(A):
...  def foo(self):
...    return "B"
...
>>> B().foo()
'B'

Являются ли они объектно-ориентированными? Я бы сказал, да. Это скорее нечто вроде подхода, а не если какой-либо конкретный язык имеет функцию X или функцию Y.

Ответ 2

Динамические языки используют утиную печать. Любой код может вызывать методы для любого объекта, который поддерживает эти методы, поэтому концепция интерфейсов является посторонним. Python фактически поддерживает перегрузку оператора, равно как Ruby.

В любом случае, вы, кажется, фокусируетесь на аспектах, которые не являются существенными для объектно-ориентированного программирования. Основное внимание уделяется таким понятиям, как инкапсуляция, наследование и полиморфизм, которые на 100% поддерживаются в Python и Ruby.

Ответ 3

Я могу говорить только для python, но были предложениями для интерфейсов, а также примерами домашнего текста в прошлом.

Тем не менее, способ, которым python работает с объектами, динамически стремится в некоторой степени уменьшить необходимость (и преимуществ) интерфейсов.

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

Ответ 4

основанный на имени полиморфизм

"Для тех из вас, кто не знаком с Python, быстро вступайте в полиморфизм, основанный на имени. У объектов Python есть внутренний словарь, содержащий строку для каждого атрибута и метода. Когда вы получаете доступ к атрибуту или методу в коде Python, Python просто ищет строку в dict.Таким образом, если вы хотите, это класс, который работает как файл, вам не нужно наследовать из файла, вы просто создаете класс, в котором есть необходимые файлы.

Python также определяет кучу специальных методов, которые вызываются соответствующим синтаксисом. Например, a + b эквивалентно a. добавить (b). Внутри Python есть несколько мест, где он напрямую управляет встроенными объектами, но полиморфизм на основе имен работает, как вы ожидаете, примерно в 98% случаев. "

Ответ 5

Python действительно обеспечивает перегрузку оператора, например. вы можете определить метод __add__, если вы хотите перегрузить +.

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

Интерфейсы в основном не нужны из-за утиного ввода текста, как указывает rossfabricant. Несколько оставшихся случаев рассматриваются в Python по ABC (абстрактные базовые классы) или интерфейсы Zope.