TG Telegram Group & Channel
Библиотека Python разработчика | Книги по питону | United States America (US)
Create: Update:

В 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

В 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<<

Библиотека Python разработчика | Книги по питону




Share with your best friend
VIEW MORE

United States America Popular Telegram Group (US)