Python/Объектно-ориентированное программирование на Python: различия между версиями

Содержимое удалено Содержимое добавлено
Строка 284:
Более того, полиморфизм в Python вообще не связан с наследованием, поэтому его можно считать сигнатурно-ориентированным полиморфизмом (signature-oriented polymorphism)<ref name="signature-oriented polymorfism">[http://lwn.net/2001/1011/a/python-url.php3 в списке рассылки comp.lang.python]</ref>. Например, чтобы экземпляру класса «прикинуться» файловым объектом, ему достаточно реализовать методы, относящиеся к файлам (обычно <code>.read()</code>, <code>.readlines()</code>, <code>.close()</code> и т. п.).
 
=== ИмитацияПереопределение встроенных типов ===
Встроенные типы и их методы имеют синтаксическую поддержку в языке Python или другие особые «привилегии». Конечно, любая операция может быть представлена синтаксисом вызова функции, однако, для частого применения это неудобно.
 
Воспользоваться точно такой же синтаксической поддержкой может и любой определённый пользователем класс. Для этого нужно лишь реализовать методы со специальными именами. Самый простой пример — имитироватьпереопределить функцию:
<source lang="python">
>>> class Add:
... def __call__(self, x, y): # определениепереопределение метода,
... return x + y # который отвечает за операцию вызова функции
...
Строка 298:
</source>
 
Аналогично поддаются имитациипереопределению все операции встроенных типов.
Ещё один пример связан с вычислением длины объекта с помощью функции <code>len()</code>. Оказывается, этаЭта встроенная функция вызывает специальный метод:
<source lang="python">
>>> class wrongList(list): # определяем собственный класс для списка
Строка 311 ⟶ 312 :
Методы <code>__getitem__,__setitem__,__delitem__,__contains__</code> позволяют создать интерфейс для словаря или списка(<code>dict</code>).
 
Достаточно просто имитироватьпереопределить и числовые типы. Скажем, следующий класс использует инфиксную операцию <code>*</code>:
<source lang="python">
class Multiplyable:
Строка 350 ⟶ 351 :
</source>
 
Не все из них существуют на самом деле: большая часть имитируется интерпретатором Python для удобства программиста. Такое поведение позволяет экономить время при наиболее важных операциях (например, сложение целых не приводит к поиску и вызову метода <code>__add__</code> у класса <code>int</code>) и память не расходуется на этот поиск и вызов, но приводит к невозможности изменения методов у встроенных классов.
 
== Отношения между классами ==