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>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 __rmul____mul__(self, xy): return x * self.value
def __imul__(self, y): return Multiplyable(self.value * y)
 
def __str__(self): return "Multiplyable(%s)" % self.value
def __rmul__(self, x):
return x * self.value
 
def __imul__(self, y):
def __mul__(self, y): return Multiplyable(self.value * y)
 
def __str__(self):
def __str__(self): return "Multiplyable(%s)" % self.value
 
>>> 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>) и память, но приводит к невозможности изменения методов у встроенных классов.
для удобства программиста. Такое поведение позволяет экономить время при наиболее важных
операциях (например, сложение целых не приводит к поиску и вызову метода <code>__add__</code>
у класса <code>int</code>) и память, но приводит к невозможности изменения методов у встроенных классов.
 
== Отношения между классами ==