Python/Объектно-ориентированное программирование на Python: различия между версиями
Содержимое удалено Содержимое добавлено
→Инкапсуляция и доступ к свойствам: оформление |
→Имитация встроенных типов: оформление |
||
Строка 281:
Воспользоваться точно такой же синтаксической поддержкой может и любой определённый пользователем класс. Для этого нужно лишь реализовать методы со специальными именами. Самый простой пример — имитировать функцию:
<source lang="python">
>>> class Add:
Строка 293 ⟶ 292 :
Аналогично поддаются имитации все операции встроенных типов. Ещё один пример связан с вычислением длины объекта с помощью функции <code>len()</code>. Оказывается, эта встроенная функция вызывает специальный метод:
<source lang="python">
>>> class wrongList(list): # определяем собственный класс для списка
Строка 304 ⟶ 302 :
</source>
Методы <code>__getitem__,__setitem__,__delitem__,__contains__</code> позволяют создать интерфейс для словаря или списка(<code>dict</code>).
Достаточно просто имитировать и числовые типы. Скажем, следующий класс использует инфиксную операцию <code>*</code>:▼
▲Достаточно просто имитировать и числовые типы. Скажем, следующий класс использует инфиксную операцию <code>*</code>:
<source lang="python">
class Multiplyable:
def __init__(self, value):
self.value = value def __mul__(self, y): return self.value * y▼
def
def __str__(self): return "Multiplyable(%s)" % self.value▼
def __rmul__(self, x):
return x * self.value
def __imul__(self, y):
def __str__(self):
>>> m = Multiplyable(1)
Строка 326 ⟶ 332 :
Последний из методов — <code>.__str__()</code> — отвечает за представление экземпляра класса при печати оператором <code>print</code> и в других подобных случаях.
Аналогичные методы имеются и у соответствующих встроенных типов:
<source lang="python">
>>> int.__add__
Строка 338 ⟶ 343 :
</source>
Не все из них существуют на самом деле: большая часть имитируется интерпретатором Python для удобства программиста. Такое поведение позволяет экономить время при наиболее важных операциях (например, сложение целых не приводит к поиску и вызову метода <code>__add__</code> у класса <code>int</code>) и память, но приводит к невозможности изменения методов у встроенных классов.
== Отношения между классами ==
|