Сделаем возможность прибавлять к канутеру любое число обычным синтаксисом
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
с + 2
++c
Еще раз о главном! Все эти операции изменяют один из операндов, что не принято в Python. Так что дальше эксперементов не стоит уходить.
Класс требует доработки чтобы не конфликтовать с принятыми нормами.
🌎 Ссылка на полный листинг
__________________________
PS. Если инкремент изменить на 0.5, то у нас получится синтаксис весьма похожий на C.
То есть, чтобы прибавить 1 надо будет написать
++x 😎, но это совсем уже будет вне всяких приличий 🥴#tricks