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

Материал из Неолурк, народный Lurkmore
Перейти к навигации Перейти к поиску

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

Источники[править]

Movax1010h.png Глубокий смысл скрыт в этих неестественных языках
Языки программированияПромышленные: BATC#CC++JavaJavaScript (AJAX) • PascalPerlPHPPythonRubyABAPАссемблерВасикFortran (Профессор)
Эзотерические: BrainFuckHQ9++ErlangForthHaskellLISP (My other car) • PrologTclΤΕΧOracleMySQLGolangВ++Scala
ПрофессииБыдлокодерПрограммистТестировщикХакерХеллоуворлдщикIT-звёздыПрограммист (существо)Тернарный операторUnreal MCP
Методы и стилиReverse EngineeringАнти-паттернВыстрелить себе в ногуГрязный хакКод (индусский) • КостыльМетод научного тыкаПомолясьСвистелки и перделкиОчередьСпортивное программированиеОбфускацияБета-тестАльфа-тестШаблоныRegReplaceФреймворкБыдлокодIndex.phpОхота за жукамиКуМирКлеточный автоматПроцедурное программированиеПоиск файлов в Unix по содержимомуPetoohФункция активации нейронаПерегрузка операторов в PythonЗерокодинг
Средства разработкиSublime TextПодсветка синтаксиса кодаUnstable DiffusionAPIPythonTutorCodeWarsDataCampUnity3DКнижный PythonMallocСвязный списокSOLIDООПУказательNULLWeLang++XenonRecompFuse.js
ЛюдиИлья КанторЮрий КлючевскийЭдуард ЛаасЭдвард СноуденСеймур Пейперт
Прочее++i + ++iДедлайн%s640 килобайтCMSDummy modeЕГГОГFoobarGod is real, unless explicitly declared as integerGOTOIfconfigKISSRegExpSICPsql.ruXyzzyДискетаИнжалид дежицеКОИ-8ЛогМанРекурсияСУБДТест ТьюрингаУмение разбираться в чужом кодеФаза ЛуныФатальный недостатокПроблема 2000ТаймстампКэшЗапись в файл без кэша (Perl)Танцы с бубномКодачХукCurl cffi