Vâng, tôi đã bỏ qua ++ và - chức năng là tốt. Một vài triệu dòng mã c khắc sâu suy nghĩ đó trong đầu cũ của tôi, và thay vì chiến đấu với nó ... Đây là một lớp học mà tôi đã tạo ra:
pre- and post-increment, pre- and post-decrement, addition,
subtraction, multiplication, division, results assignable
as integer, printable, settable.
Đây là:
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
Bạn có thể sử dụng nó như thế này:
c = counter() # defaults to zero
for listItem in myList: # imaginary task
doSomething(c.postinc(),listItem) # passes c, but becomes c+1
... đã có c, bạn có thể làm điều này ...
c.set(11)
while c.predec() > 0:
print c
.... hoặc chỉ ...
d = counter(11)
while d.predec() > 0:
print d
... và cho (tái) gán thành số nguyên ...
c = counter(100)
d = c + 223 # assignment as integer
c = c + 223 # re-assignment as integer
print type(c),c # <type 'int'> 323
... trong khi điều này sẽ duy trì c là bộ đếm loại:
c = counter(100)
c.set(c + 223)
print type(c),c # <class '__main__.counter'> 323
BIÊN TẬP:
Và sau đó có một chút hành vi bất ngờ (và hoàn toàn không mong muốn) ,
c = counter(42)
s = '%s: %d' % ('Expecting 42',c) # but getting non-numeric exception
print s
... bởi vì bên trong bộ dữ liệu đó, getitem () không phải là thứ được sử dụng, thay vào đó, một tham chiếu đến đối tượng được chuyển đến hàm định dạng. Thở dài. Vì thế:
c = counter(42)
s = '%s: %d' % ('Expecting 42',c.v) # and getting 42.
print s
... Hoặc, rõ ràng hơn, và rõ ràng những gì chúng ta thực sự muốn xảy ra, mặc dù được chỉ định ngược lại ở dạng thực tế bởi tính dài dòng ( c.v
thay vào đó sử dụng ) ...
c = counter(42)
s = '%s: %d' % ('Expecting 42',c.__getitem__()) # and getting 42.
print s