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>).
Достаточно просто
<source lang="python">
class Multiplyable:
Строка 350 ⟶ 351 :
</source>
Не все из них существуют на самом деле: большая часть имитируется интерпретатором Python для удобства программиста. Такое поведение позволяет экономить время при наиболее важных операциях (например, сложение целых не приводит к поиску и вызову метода <code>__add__</code> у класса <code>int</code>) и память не расходуется на этот поиск и вызов, но приводит к невозможности изменения методов у встроенных классов.
== Отношения между классами ==
|