हाँ, मुझे ++ और - साथ ही कार्यक्षमता याद आ गई। सी कोड की कुछ मिलियन लाइनों ने मेरे पुराने सिर में इस तरह की सोच को उलझा दिया, और इसे लड़ने के बजाय ... यहाँ एक वर्ग है जिसे मैंने लागू किया है:
pre- and post-increment, pre- and post-decrement, addition,
subtraction, multiplication, division, results assignable
as integer, printable, settable.
यहाँ 'tis:
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 प्रकार काउंटर के रूप में बनाए रखेगा:
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
... क्योंकि उस tuple के अंदर, 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