Найти в Дзене
HollowMeaning

Python. Инкремент с помощью __pos__

В Python нет операции инкремента ++ как в си-подобных языках, поэтому используется x += 1. Однако запись ++x является валидным кодом (но не x++), так как это просто два унарных оператора сложения.

При применении унарного плюса у объекта вызывается магический метод __pos__, сделаем небольшое отступление и разберем, что такое магический метод в сжатом варианте, что бы лучше понимать происходящие. Подробнее сделаю пост про магические методы в будущем.

Магические методы, или dunder-методы предназначены для перегрузки Python-операторов или встроенных методов. А нужны они, чтобы реализовывать свойства объектов при их взаимодействии и выделяется двумя нижними подчеркиваниями с обеих сторон (__).

Вернемся к нашим баранам, магический метод __pos__ переопределяет унитарный оператор +, то есть запись ++x можно понять как x.__pos__().__pos__(). Зная это, можно реализовать класс, который будет представлять число и поддерживать поведение инкремента.

class Number:
~def __init__(self, value):
~~self._value = value
~def __pos__(self):
~~return self._Incrementer(self)
~def __str__(self):
~~return str(self._value)
~class _Incrementer:
~~def __init__(self, number):
~~~self._number = number
~~def __pos__(self):
~~~self._number._value += 1
x = Number(4)
print(x) # 4
++x
print(x) # 5

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

Так же изменив тело метода __pos__ в классе Incrementer например на self._number._value **=2, при использовании инкремента (++) ты будем получать квадрат текущего значения. Можем увидеть на примере.

class Number:
~def __init__(self, value):
~~self._value = value
~def __pos__(self):
~~return self._Incrementer(self)
~def __str__(self):
~~return str(self._value)
~class _Incrementer:
~~def __init__(self, number):
~~~self._number = number
~~def __pos__(self):
~~~self._number._value **= 2
x = Number(4)
print(x) # 4
++x
print(x) # 16
++x
print(x) # 256

Таким образом мы можем реализовать, любой необходимый сценарий для поставленной задачи.

YouTube:
https://youtube.com/@HollowMeaning

Telegram: https://t.me/HollowMeaning