Расширенный вариант каунтера из прошлого примера. Оказалось ему есть куда еще развиваться и без унарных операторов))). Добавим обработку бинарных операторов "+" и "-".
Сделаем возможность прибавлять к канутеру любое число обычным синтаксисом
def __add__(self, other):
self.val += int(other)
def __sub__(self, other):
self.val += int(other)
Теперь можно делать так:
>>> c = Counter(3)
>>> c + 2
>>> print(c)
Count: 5
Добавим обработку для случая когда наш каунтер справа
def __radd__(self, other):
self.__add__(other)
def __rsub__(self, other):
self.__sub__(other)
>>> c = Counter(3)
>>> 2 + с
>>> print(c)
Count: 5
Добавим во все методы возвращаемое значение и будем возвращать self:
def __pos__(self, *args):
self.val += 1
return self
def __neg__(self):
self.val -= 1
return self
...
Тоже самое в остальных.
Теперь такой синтаксис тоже допустим (и тоже антипаттерн!):
>>> c = Counter()
>>> print(c)
Count: 0
>>> ++c
Count: 2
>>> ++++c
Count: 6
>>> ---c
Count: 3
А так же теперь доступен такой вариант
>>>
c += 2
Count: 5
Следующие три записи идентичны по результату
с += 2
с + 2
++c
Во всех случаях каунтер с увеличится на 2
Еще раз о главном! Все эти операции изменяют один из операндов, что не принято в Python. Так что дальше эксперементов не стоит уходить.
Класс требует доработки чтобы не конфликтовать с принятыми нормами.
🌎Ссылка на полный листинг
__________________________
PS. Если инкремент изменить на 0.5, то у нас получится синтаксис весьма похожий на C.
То есть, чтобы прибавить 1 надо будет написать ++x 😎, но это совсем уже будет вне всяких приличий 🥴
#tricks