Да, я пропустил ++ и - функциональность. Несколько миллионов строк кода С укоренено такого рода мышления в моей старой голове, и вместо борьбы с ней ... Вот класс я мощеные вверх, реализующий:
pre- and post-increment, pre- and post-decrement, addition,
subtraction, multiplication, division, results assignable
as integer, printable, settable.
Вот ТИС:
class counter(object):
def __init__(self,v=0):
self.set(v)
def preinc(self):
self.v += 1
return self.v
def predec(self):
self.v -= 1
return self.v
def postinc(self):
self.v += 1
return self.v - 1
def postdec(self):
self.v -= 1
return self.v + 1
def __add__(self,addend):
return self.v + addend
def __sub__(self,subtrahend):
return self.v - subtrahend
def __mul__(self,multiplier):
return self.v * multiplier
def __div__(self,divisor):
return self.v/divisor
def __getitem__(self):
return self.v
def __str__(self):
return str(self.v)
def set(self,v):
if type(v) != int:
v = 0
self.v = v
вы могли бы использовать его как это:
c = counter() # defaults to zero
for listItem in myList: # imaginary task
doSomething(c.postinc(),listItem) # passes c, but becomes c+1
... уже имея с, вы могли бы сделать это ...
c.set(11)
while c.predec() > 0:
print c
.... или просто ...
d = counter(11)
while d.predec() > 0:
print d
... и (ре) присваивания в целое ...
c = counter(100)
d = c + 223 # assignment as integer
c = c + 223 # re-assignment as integer
print type(c),C# <type 'int'> 323
... в то время как это будет поддерживать гр как тип счетчика:
c = counter(100)
c.set(c + 223)
print type(c),C# <class '__main__.counter'> 323
РЕДАКТИРОВАТЬ:
И тогда есть этот бит неожиданных (и тщательно нежелательного) поведения,
c = counter(42)
s = '%s: %d' % ('Expecting 42',c) # but getting non-numeric exception
print s
... потому что внутри этого кортежа, GetItem() не то, что используется, вместо того, чтобы ссылка на объект передается к функции форматирования. Вздох. Итак:
c = counter(42)
s = '%s: %d' % ('Expecting 42',c.v) # and getting 42.
print s
... или, более пространно, и явно, что мы на самом деле хотели случиться, хотя противопоказано в реальной форме многословие (используйте c.v
вместо этого) ...
c = counter(42)
s = '%s: %d' % ('Expecting 42',c.__getitem__()) # and getting 42.
print s
Ваше редактирование подчеркивает определенные слова, но я не понимаю, почему. –
Крис: Вы ответили на мой вопрос (что). Кроме того, я хотел бы знать, почему Python отличается от этого поведения от C/C++. –
Python не является C или C++. Различные дизайнерские решения вступили в формулирование языка. В частности, Python намеренно не определяет операторы присваивания, которые могут использоваться в произвольном выражении; скорее, есть утверждения присваивания и расширенные инструкции присваивания. См. Ссылку ниже. –