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