В Python нет оператора ++
, вместо него используется x += 1
. Однако синтаксис ++x
всё ещё допустим (в отличие от x++
, который вызывает ошибку).
Суть в том, что в Python есть унарный плюс, и выражение ++x
на самом деле интерпретируется как x.__pos__().__pos__()
. Этим можно злоупотребить и заставить ++
работать как инкремент (хотя так делать не рекомендуется):
class Number:
def __init__(self, value):
self._value = value
def __pos__(self):
return self._Incrementer(self)
def inc(self):
self._value += 1
def __str__(self):
return str(self._value)
class _Incrementer:
def __init__(self, number):
self._number = number
def __pos__(self):
self._number.inc()
x = Number(4)
print(x) # 4
++x
print(x) # 5
Здесь
++x
вызывает дважды __pos__()
: сначала на x
, затем на возвращённом объекте _Incrementer
, в котором второй __pos__()
вызывает inc()
, увеличивая значение.👉@BookPython
>>Click here to continue<<