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

Ниже приведены операторы, которые могут быть перегружены в классах, а также необходимые определения методов и пример использования оператора в выражении.

NB Использование other в качестве имени переменной не является обязательным, но считается нормой.

оператор метод выражение + Сложение __add__(self, other) a1 + a2 - Вычитание __sub__(self, other) a1 - a2 * Умножение __mul__(self, other) a1 * a2 @ Умножение матриц __matmul__(self, other) a1 @ a2 (Python 3.5) / Отдел __div__(self, other) a1 / a2 (только Python 2) / Отдел __truediv__(self, other) a1 / a2 (Python 3) // Отдел пола __floordiv__(self, other) a1 // a2 % Модульный / Остаток __mod__(self, other) a1 % a2 ** Мощность __pow__(self, other[, modulo]) a1 ** a2 << побитового сдвига влево __lshift__(self, other) a1 << a2 >> побитовое смещение вправо __rshift__(self, other) a1 >> a2 & Побитовое __and__(self, other) a1 & a2 ^ Побитовое исключающее ИЛИ __xor__(self, other) a1 ^ a2 | (Побитовое ИЛИ) __or__(self, other) a1 | a2 - Отрицание (Арифметический) __neg__(self) -a1 + Положительно __pos__(self) +a1 ~ Побитовое НЕ __invert__(self) ~a1 < Меньше чем __lt__(self, other) a1 < a2 <= Меньше или равно __le__(self, other) a1 <= a2 == Равно __eq__(self, other) a1 == a2 != Не равно __ne__(self, other) a1 != a2 > Больше чем __gt__(self, other) a1 > a2 >= Больше или равно __ge__(self, other) a1 >= a2 [index] Оператор Индекс __getitem__(self, index) a1[index] in операторах В __contains__(self, other) a2 in a1 (*args, ...) Вызов __call__(self, *args, **kwargs) a1(*args, **kwargs)

Необязательный параметр по modulo для __pow__ используется только в pow встроенной функции.

Каждый из методов , соответствующих бинарный оператор имеет соответствующий «правильный» метод , который начать с __r , например __radd__ :

 class A:
    def __init__(self, a):
        self.a = a
    def __add__(self, other):
        return self.a + other
    def __radd__(self, other):
        print("radd")
        return other + self.a

A(1) + 2  # Out:  3
2 + A(1)  # prints radd. Out: 3

 

а также соответствующая версия Inplace, начиная с __i :

 class B:
    def __init__(self, b):
        self.b = b
    def __iadd__(self, other):
        self.b += other
        print("iadd")
        return self

b = B(2)
b.b       # Out: 2
b += 1    # prints iadd
b.b       # Out: 3

 

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

функция метод выражение Кастинг для int __int__(self) int(a1) Абсолютная функция __abs__(self) abs(a1) Кастинг на str __str__(self) str(a1) Кастинг для unicode __unicode__(self) unicode(a1) (Python 2 только) Строковое представление __repr__(self) repr(a1) Приведение к bool __nonzero__(self) bool(a1) Форматирование строки __format__(self, formatstr) "Hi {:abc}".format(a1) хеширования __hash__(self) hash(a1) длина __len__(self) len(a1) округление __round__(self) round(a1) Перевернутый __reversed__(self) reversed(a1) Этаж __floor__(self) math.floor(a1) Этаж __floor__(self) math.floor(a1) потолок __ceil__(self) math.ceil(a1)

Есть также специальные методы __enter__ и __exit__ для менеджеров контекста, и многих других.