Перегрузка операторов в Python
Перегрузка операторов в 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__
. Первый из них отвечает за прибавление объекта справа (на случай создания объектов, для которых операция сложения некоммутативна), второй — за операторы вида «+=
».