Перегрузка операторов в Python

Материал из ALL
Перейти к: навигация, поиск

Перегрузка операторов в Python (operator overloading) — возможность в языке программирования Python, позволяющая определить в объектах собственную логику для выполнения операций при помощи стандартных операторов («+», «<», «^» и др.).

По умолчанию, например, нельзя сравнивать экземпляр собственного объекта с числом или прибавить к нему число с плавающей запятой. Ошибку вызовет и попытка преобразовать объект в строковое представление с помощью функции str.

Перегрузка оператора производится при помощи определения методов класса со специальными названиями, начинающимися с __.

Пример перегрузки строкового оператора и оператора сложения:

class ExampleClass:
    a = 0
    b = 0
 
    def __init__(self, a = 0, b = 0):
        self.a = a
        self.b = b
 
    def __str__(self):
        return "%d & %d" % (self.a, self.b)
 
    def __add__(self, other):
        assert isinstance(other, ExampleClass), "ExampleClass can be added only to another ExampleClass"
        return ExampleClass(self.a + other.a, self.b + other.b)
 
    def __radd__(self, other):
        return self.__add__(other)

Как видно, это класс содержит два поля a и b. Экземпляры класса можно складывать между собой, но нельзя складывать с любыми иными объектами. Также можно получить строковое представление объекта.

Список операторов

  • __repr__ — представление в виде строки, позволяющее восстановить объект с теми же значениями
  • __str__ — вызывается str(object)
  • __len__ — вызывается len(object)

Операторы отношений (возвращают True или False):

  • __lt__ — x < y
  • __le__ — x <= y
  • __gt__ — x > y
  • __ge__ — x >= y
  • __eq__ — x = y
  • __ne__ — x != y
  • __bool__ — имеет ли объект значение True или False (в Python 3)
  • __nonzero__ — имеет ли объект значение True или False (в Python 2)

Арифметические операторы:

  • __add__ — x + y
  • __sub__ — x - y
  • __mul__ — x * y
  • __truediv__ — x / y (в Python 3)
  • __floordiv__ — x // y (в Python 3)
  • __div__x / y (в Python 2)
  • __mod__ — x % y
  • __divmod__ — divmod(x, y)
  • __pow__ — x ** power
  • __and__ — x & y
  • __xor__ — x ^ y
  • __or__ — x | y

Если аримфетические операторы не могут вернуть ответ с заданными операндами, они обязаны вернуть NotImplemented.

Для арифметических операторов также могут быть определены (и должны быть определены в большинстве случаев) методы с названиями, отличающимися на буквы r и i, например, __radd__ и __iadd__. Первый из них отвечает за прибавление объекта справа (на случай создания объектов, для которых операция сложения некоммутативна), второй — за операторы вида «+=».

Источники