Полиморфизм - определяет во всего двух [закрытых] предложениях

Функция является вызываемым объектом в Python, то есть может быть вызвана с помощью оператора вызова (хотя другие объекты могут эмулировать функцию путем реализации __call__). Например:

>>> def a(): pass
>>> a
<function a at 0x107063aa0>
>>> type(a)
<type 'function'>

Метод является специальным классом функции, который может быть связан или несвязанным .

>>> class A:
...   def a(self): pass
>>> A.a
<unbound method A.a>
>>> type(A.a)
<type 'instancemethod'>

>>> A().a
<bound method A.a of <__main__.A instance at 0x107070d88>>
>>> type(A().a)
<type 'instancemethod'>

Конечно, несвязанный метод нельзя вызывать (по крайней мере, не напрямую, не передавая экземпляр как аргумент):

>>> A.a()
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
TypeError: unbound method a() must be called with A instance as first argument (got nothing instead)

В Python в большинстве случаев вы не заметят разницу между связанным методом, функцией или вызываемым объектом (т. е. объектом, который реализует __call__), или конструктором класса. Все они выглядят одинаково, у них просто разные соглашения об именах. Под капотом объекты могут выглядеть значительно иначе.

Это означает, что связанный метод может использоваться как функция, это одна из многих мелких вещей, которая делает Python настолько мощным

>>> b = A().a
>>> b()

Это также означает, что хотя между len(...) и str(...) существует принципиальное различие (последний является конструктором типа), вы не заметите разницу, пока не будете копать немного глубже:

>>> len
<built-in function len>
>>> str
<type 'str'>
83
задан Community 23 May 2017 в 12:26
поделиться

19 ответов

Полиморфизм позволяет какое-то выражение контракта, с потенциально многими типами, реализовывая тот контракт (ли посредством наследования классов или не) по-разному, каждый согласно их собственной цели. Код использование , что контракт не должен (*), должно заботиться, о котором реализация включена, только что контракту повинуются.

(*) В идеальном случае, так или иначе - очевидно, довольно часто код вызова выбрал соответствующую реализацию очень сознательно!

103
ответ дан Jon Skeet 24 November 2019 в 08:40
поделиться

Полиморфизм

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

Через: http://www.agiledata.org/essays/objectOrientation101.html

1
ответ дан 24 November 2019 в 08:40
поделиться

Давание единственного имени к ряду аналогичных операций на различных типах. Когда преуспели, аналогия является очевидными, например, "добавляющими" числами арифметически и "добавляющими" строками конкатенацией (который суммирует их длины).

1
ответ дан joel.neely 24 November 2019 в 08:40
поделиться

Несколько форм отдельного объекта называют Полиморфизмом.

2
ответ дан milot 24 November 2019 в 08:40
поделиться

полиморфизм == несколько классов + те же сигнатуры методов + определенное для класса поведение.

5
ответ дан S.Lott 24 November 2019 в 08:40
поделиться

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

Paul.

5
ответ дан Paul W Homer 24 November 2019 в 08:40
поделиться

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

хорошо это твердо....

6
ответ дан JoshBerke 24 November 2019 в 08:40
поделиться

Википедия: Полиморфизм является функцией языка программирования, которая позволяет значениям различных типов данных быть обработанными с помощью универсального интерфейса. Довольно простой для меня.

20
ответ дан Otávio Décio 24 November 2019 в 08:40
поделиться

На самом деле существует несколько форм полиморфизма и существует некоторое противоречие по нему; можно даже видеть преподавателей CS, которые не могут определить его правильно. Я знаю о трех типах:

  • специальный полиморфизм (похож на утку и идет как утка =>, является уткой). Будьте видны в Haskell и Python, например.

  • универсальный полиморфизм (где тип является экземпляром некоторого универсального типа). Будьте видны в C++, например (вектор интервала и вектор строки, у обоих есть размер функции членства).

  • полиморфизм подтипа (где тип наследовался другому типу). Будьте видны на большинстве языков программирования OO (т.е. Треугольником является Форма).

21
ответ дан 24 November 2019 в 08:40
поделиться

Polymorphism объявляет универсальный интерфейс, который не является знающим типом, оставляя детали реализации конкретным типам, которые реализуют интерфейс.

47
ответ дан Eran Galperin 24 November 2019 в 08:40
поделиться

Фрукты можно съесть, как правило, но различные типы фруктов едят по-разному. Яблоко, которое является фруктом, можно съесть (потому что это - фрукт). Банан можно также съесть (потому что это - также фрукт), но другим способом от яблока. Вы очищаете его сначала.

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

Это иллюстрирует наследование (фрукты можно съесть), полиморфизм (что-то, которое ест, фрукты могут съесть все типы фруктов), и инкапсуляция (банан имеет кожу).

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

69
ответ дан Dmitry 24 November 2019 в 08:40
поделиться

Определение:

Полиморфизм является словом за 10$ для идеи за 1$ - что, когда я прошу что-то быть сделанным, я не забочусь, как он достигается, пока конечный результат является соответствующим. Пока услуга предоставляется правильно, я не забочусь о реализации.

Обсуждение

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

Примеры

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

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

10
ответ дан Bevan 24 November 2019 в 08:40
поделиться

Я действительно понимаю, почему вы задаете этот вопрос. Я понимаю полиморфизм, но на собеседовании меня попросили дать краткое и четкое определение полиморфизма. Поскольку я не мог дать четкого и краткого определения, я начал думать об этом, и вот мое определение:

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

14
ответ дан 24 November 2019 в 08:40
поделиться

Поиск имени происходит до разрешения перегрузки, поэтому, как только Foo был найден в Concrete , базовые классы не будет искать другие методы, называемые Foo . int Foo (int) в Derived скрыт Foo в Concrete .

У вас есть несколько вариантов.

Измените вызов на явный.

concrete.Derived::Foo(an_int);

Добавьте объявление using в Concrete.

class Concrete : public Derived {
public:          
   using Derived::Foo;
   double Foo(double);
};

Вызовите функцию через базовую ссылку.

10
ответ дан 24 November 2019 в 08:40
поделиться

Это определение, которому я всегда следовал:

Два объекта полиморфны (по отношению к определенному протоколу) между ними, если оба отвечают на одни и те же сообщения с одинаковой семантикой.

Полиморфизм связан с сообщениями, с возможностью отвечать на один и тот же набор сообщений с одинаковой семантикой.

Если два объекта МОГУТ ответить пустым? но семантика сообщения другая, значит .. они не полиморфны.

1
ответ дан 24 November 2019 в 08:40
поделиться

Полиморфизм на более низком уровне - это возможность вызывать методы, которые определены реализаторами интерфейса из экземпляра интерфейса.

1
ответ дан 24 November 2019 в 08:40
поделиться

Джеймс и Эд верны. Если вы попадаете на случай, в котором вы хотите, чтобы все выражения были оценены независимо от предыдущих неудачных условий, вы можете использовать логический оператор без короткого замыкания & .

-121--1414210-

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

1
ответ дан 24 November 2019 в 08:40
поделиться

Я думаю, иногда объекты динамически называются. Вы не уверены, будет ли объект треугольником, квадратным и т. Д. В классической форме поли. пример.

Итак, оставить все такое позади, мы просто называем функцию производного класса и предполагаем, что один из динамических классов будет вызван.

Вы бы не заботились, если его SQAURE, треугольник или прямоугольник. Вы просто заботитесь о районе. Следовательно, метод Getarea будет вызываться в зависимости от переданного динамического объекта.

-2
ответ дан 24 November 2019 в 08:40
поделиться

Единый класс, делающий различные методы, называют полиморфизмом.

-5
ответ дан 24 November 2019 в 08:40
поделиться