###
class Ring(list):
def __init__(self, l):
self[:] = l
self._zero = 0
def turn(self, incr=1):
self._zero+=incr
def __getitem__(self, i): return self[(i-self._zero)%len(self)]
l=Ring(range(10)) print l l.turn(5) print l #same as original print l[0] #crashes python ###
This is a classic mistake. l[0] --> l.__getitem__(l, 0), which you understand. However in __getitem__ you then call self[] which will just call __getitem__ again. and again. and again. ....
The way out is to explicitly call the parent's __getitem__.
def __getitem__(self, i):
# list is out parent, call its method
return list.__getitem__(self, (i - self._zero) % len(self))
_______________________________________________
Tutor maillist - [email protected]
http://mail.python.org/mailman/listinfo/tutor
