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