[Tutor] working with new classes

C Smith smichr at hotmail.com
Wed Mar 9 08:22:14 CET 2005


Hello,

After learning about the new class behavior, I am trying to implement a 
circular type list where, for example, you can compare the nth value to 
the "(n+1)th" value without worrying about going past the end of the 
list. (An old approach might be to create a function that converts a 
given index to the real index (e.g. maps the "(n+1)th" value back to 
the 1st value), but I thought I would try subclassing the list 
behavior.)

Seeing an ASPN entry on circular lists 
(http://aspn.activestate.com/ASPN/Cookbook/Python/Recipe/52246), I 
first tried to define a "turn" method for the list.  The following works

###
class ring(list):
	def turn(self, incr=1):
		tail=self[incr:]
		head = self[:incr]
		self[:] = tail+head

l=ring(range(10))
l.turn(5) #the list now has a turn method
print l   #--> [5, 6, 7, 8, 9, 0, 1, 2, 3, 4]
###

Then I tried to redefine how the list is initialized, desiring to give 
it a "zero" attribute which will be used whenever an item from the list 
is requested. I'm hoping not to have work with slices of the list--I 
just change how it is accessed.  BUT...it doesn't work. Apparently 
__getitem__ is not accessed in order to print the list; and Python 
crashes when I try to print a single element.

Am I trying to subclass the wrong aspects of the list?

###
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
###

/c




More information about the Tutor mailing list