Полиморфизм функций в Python 


Мы поможем в написании ваших работ!



ЗНАЕТЕ ЛИ ВЫ?

Полиморфизм функций в Python



Python – язык с динамической типизацией, полиморфизм в нем проявляется повсюду.

Фактически все операции в языке Python являются полиморфическими: вывод, извлечение элемента, оператор * и многие другие. В языке Python именно объекты определяют синтаксический смысл операции. Например, оператор * – это всего лишь указание для обрабатываемых объектов. Смысл операции зависит от типов обрабатываемых объектов.

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

Если функции будут переданы объекты, которые не поддерживают ожидаемый интерфейс, интерпретатор обнаружит ошибку при выполнении и автоматически возбудит исключение. Отсутствие проверки на наличие ошибок в программном коде можно заменить последующим тестированием программы. Добавив такую проверку, мы ограничим область применения нашей функции, так как она сможет работать только с теми типами объектов, которые мы заранее предусмотрели.

Это важнейшее отличие философии языка Python от языков программирования со статической типизацией, таких как C++ и Java: программный код на языке Python не делает предположений о конкретных типах данных. В противном случае он сможет работать только с теми типами данных, которые ожидались на момент его написания, и он не будет поддерживать объекты других совместимых типов, которые могут быть созданы в будущем. Проверку типа объекта можно выполнить с помощью таких средств, как встроенная функция type, но в этом случае программный код потеряет свою гибкость.

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

В языке Питон отсутствует полиморфизм функций в модели С++. Разные функции должны иметь разные имена.

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

КОНТРОЛЬНЫЕ ВОПРОСЫ

1. Будет ли ошибочным следующий код:

def f(x):
return x * 2

f(1) * f("2")

f(3.) * f(f(4))

РЕШЕНИЕ

Нет, не будет.

Благодаря полиморфизму функций по типам параметров с каждым из аргументов будет приключаться своё: числа будут умножаться на два, а строка — повторяться дважды.

 

2. Будет ли ошибочным следующий код:

def f(x):
return x

def f(x):
return 2 * x

def f(x):
return 3 * x

print(f(5))

РЕШЕНИЕ

Нет, не будет. При этом первые две функции, поскольку их имена более недоступны в пространстве имен, фактически перестают существовать.

При вызове print(f(5)) будет вызвана последняя функция, результат вычислений будет равен 15.

Утиная типизация

Утиной типизацией в программировании называют следующий принцип:

Если что-то ходит как утка и крякает как утка, то это утка.

Применяется этот принцип следующим образом. Пусть, например, у нас есть функция max, определенная следующим образом:

def max(a, b):
if a > b:
return a
else:
return b

Какого типа объекты ей можно передать? Оказывается, тип объектов эту функцию не интересует вовсе. Ей важно лишь, чтобы для этих объектов была определена операция > (иногда говорят " определен соответствующий интерфес"). В этом смысле объекты, передаваемые функции max, должны лишь "крякать как утки".



Поделиться:


Последнее изменение этой страницы: 2017-02-19; просмотров: 399; Нарушение авторского права страницы; Мы поможем в написании вашей работы!

infopedia.su Все материалы представленные на сайте исключительно с целью ознакомления читателями и не преследуют коммерческих целей или нарушение авторских прав. Обратная связь - 3.237.51.235 (0.003 с.)