Лутц, стр 826.
Контрольные вопросы
- Какие два метода перегрузки операторов можно использовать для поддержки итераций в классах?
- Какие два метода перегрузки операторов можно использовать для вывода и в каких случаях?
- Как реализовать в классе операции над срезами?
- Как реализовать в классе операцию приращения значения самого объекта?
- Когда следует использовать методы перегрузки операторов?
Ответы
Классы могут обеспечить поддержку итераций, определив (или унаследовав) метод __getitem__ или __iter__. Во всех итерационных контекстах интерпретатор Python сначала пытается использовать метод __iter__ (который возвращает объект, поддерживающий итерационный протокол в виде метода __next__): если метод __iter__ не будет найден в результате поиска по дереву наследования, интерпретатор возвращается к использованию метода извлечения элемента по его индексу __getitem__ (который вызывается многократно и при каждом вызове получает постоянно увеличивающиеся значения индексов).
Вывод объекта реализуют методы __str__ и __repr__. Первый из них вызывается встроенными функциями print и str; последний также вызывается функциями print и str, если в классе отсутствует метод __str__, и всегда - встроенной функцией repr, функцией автоматического вывода интерактив- ной оболочки и при выводе вложенных экземпляров. То есть метод __repr__ используется везде, за исключением функций print и str, если определен метод __str__. Метод __str__ обычно используется для вывода объектов в удобочитаемом представлении; метод __repr__ выводит дополнительные подробности об объекте или представляет объект в виде программного кода.
Операцию извлечения среза можно перехватить с помощью метода __getitem__: в этом случае ему передается не простой числовой индекс, а объект среза. В Python 2.6 точно так же можно использовать метод __getslice__ (в версии 3.0 он уже не используется).
Операция приращения пытается сначала вызвать метод __iadd__, а затем метод __add__ с последующим присваиванием. Тот же самый прием может применяться для всех двухместных операторов. Кроме того, правостороннее сложение можно реализовать с помощью метода __radd__.
Когда класс естественным образом соответствует встроенным типам или должен подражать их поведению. Например, классы коллекций могут имитировать поведение последовательностей или отображений. Как правило, не следует реализовать методы перегрузки операторов, если они не являются естественными для ваших объектов, – лучше использовать методы с обычными именами.