Функция является вызываемым объектом в 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'>
Полиморфизм позволяет какое-то выражение контракта, с потенциально многими типами, реализовывая тот контракт (ли посредством наследования классов или не) по-разному, каждый согласно их собственной цели. Код использование , что контракт не должен (*), должно заботиться, о котором реализация включена, только что контракту повинуются.
(*) В идеальном случае, так или иначе - очевидно, довольно часто код вызова выбрал соответствующую реализацию очень сознательно!
Полиморфизм
Различные объекты могут ответить на то же сообщение по-разному, включить объектам взаимодействовать друг с другом, не зная их точный тип.
Через: http://www.agiledata.org/essays/objectOrientation101.html
Давание единственного имени к ряду аналогичных операций на различных типах. Когда преуспели, аналогия является очевидными, например, "добавляющими" числами арифметически и "добавляющими" строками конкатенацией (который суммирует их длины).
Несколько форм отдельного объекта называют Полиморфизмом.
полиморфизм == несколько классов + те же сигнатуры методов + определенное для класса поведение.
Полиморфизм является программным обеспечением, кодирующим абстракцию, где несколько различных базовых объектов (обычно данные, но гнида всегда) вся доля единый интерфейс, который позволяет им смотреть и действовать идентичные во времени выполнения. Мы используем это в качестве метода разработки для осуществления последовательного поведения по широкому спектру подобных, но не идентичные экземпляры с абсолютной минимальной реализацией, таким образом уменьшая ожидание ошибок и несоответствий.
Paul.
Полиморфизм является объектно-ориентированной стратегией, используемой при разработке объектных моделей, чтобы помочь упростить код. В он - базовый полиморфизм, способность определить два подобных все же различных объекта и тогда рассматривать два объекта, как будто они - то же.
хорошо это твердо....
Википедия: Полиморфизм является функцией языка программирования, которая позволяет значениям различных типов данных быть обработанными с помощью универсального интерфейса. Довольно простой для меня.
На самом деле существует несколько форм полиморфизма и существует некоторое противоречие по нему; можно даже видеть преподавателей CS, которые не могут определить его правильно. Я знаю о трех типах:
специальный полиморфизм (похож на утку и идет как утка =>, является уткой). Будьте видны в Haskell и Python, например.
универсальный полиморфизм (где тип является экземпляром некоторого универсального типа). Будьте видны в C++, например (вектор интервала и вектор строки, у обоих есть размер функции членства).
полиморфизм подтипа (где тип наследовался другому типу). Будьте видны на большинстве языков программирования OO (т.е. Треугольником является Форма).
Polymorphism объявляет универсальный интерфейс, который не является знающим типом, оставляя детали реализации конкретным типам, которые реализуют интерфейс.
Фрукты можно съесть, как правило, но различные типы фруктов едят по-разному. Яблоко, которое является фруктом, можно съесть (потому что это - фрукт). Банан можно также съесть (потому что это - также фрукт), но другим способом от яблока. Вы очищаете его сначала.
ну, по крайней мере, я делаю, но я являюсь странным некоторыми способами поэтому, что я знаю.
Это иллюстрирует наследование (фрукты можно съесть), полиморфизм (что-то, которое ест, фрукты могут съесть все типы фруктов), и инкапсуляция (банан имеет кожу).
Серьезно, хотя, объектное наследование, полиморфизм, инкапсуляция, виртуальные вещи, абстрактные вещи, частные вещи, общедоступные вещи, это все трудные понятия. Если кто-то абсолютно хочет иметь определение с 2 предложениями этого, тогда отметьте вопрос как вариант гольфа кода, потому что два таких предложения должны будут быть столь краткими, что, если Вы не знаете то, что это уже, Вы не узнаете достаточно об этом для знания то, о чем необходимо узнать больше.
Определение:
Полиморфизм является словом за 10$ для идеи за 1$ - что, когда я прошу что-то быть сделанным, я не забочусь, как он достигается, пока конечный результат является соответствующим. Пока услуга предоставляется правильно, я не забочусь о реализации.
Обсуждение
В то время как это является наиболее часто используемым в разработке программного обеспечения, особенно в системах, разработанных после объектно-ориентированных принципов, Полиморфизм является существенно принципом реального мира и должен быть определен в условиях реального мира, не технологических.
Примеры
Когда я хочу выполнить телефонный вызов, я поднимаю трубку, набираю номер и говорю со стороной в другом конце. Я не забочусь о том, кто сделал телефон, какую технологию он использует, соединен ли он проводом, беспроводная связь, мобильная или VoIP, или находится ли он под гарантией.
Когда я хочу распечатать документ, я печатаю его. Я не забочусь о языке реализации, бренде принтера, стиле соединения, выборе потребляемых или качестве бумаги.
Я действительно понимаю, почему вы задаете этот вопрос. Я понимаю полиморфизм, но на собеседовании меня попросили дать краткое и четкое определение полиморфизма. Поскольку я не мог дать четкого и краткого определения, я начал думать об этом, и вот мое определение:
Способность объектов одного типа иметь один и тот же интерфейс, но разную реализацию этого интерфейса.
Поиск имени происходит до разрешения перегрузки, поэтому, как только 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);
};
Вызовите функцию через базовую ссылку.
Это определение, которому я всегда следовал:
Два объекта полиморфны (по отношению к определенному протоколу) между ними, если оба отвечают на одни и те же сообщения с одинаковой семантикой.
Полиморфизм связан с сообщениями, с возможностью отвечать на один и тот же набор сообщений с одинаковой семантикой.
Если два объекта МОГУТ ответить пустым? но семантика сообщения другая, значит .. они не полиморфны.
Полиморфизм на более низком уровне - это возможность вызывать методы, которые определены реализаторами интерфейса из экземпляра интерфейса.
Джеймс и Эд верны. Если вы попадаете на случай, в котором вы хотите, чтобы все выражения были оценены независимо от предыдущих неудачных условий, вы можете использовать логический оператор без короткого замыкания &
.
Полиморфизм - это функция программирования, которая позволяет объекту иметь много типов («форм»), и позволяет вам относиться к нему любое из этих типов в зависимости от того, что вам нужно делать, не зная или не заботясь о том, его другие типы.
Я думаю, иногда объекты динамически называются. Вы не уверены, будет ли объект треугольником, квадратным и т. Д. В классической форме поли. пример.
Итак, оставить все такое позади, мы просто называем функцию производного класса и предполагаем, что один из динамических классов будет вызван.
Вы бы не заботились, если его SQAURE, треугольник или прямоугольник. Вы просто заботитесь о районе. Следовательно, метод Getarea будет вызываться в зависимости от переданного динамического объекта.
Единый класс, делающий различные методы, называют полиморфизмом.