how do I write a scliceable class?
eadrogue at gmx.net
Sat Feb 13 15:53:20 CET 2010
Thanks a lot for your comments. I think I've got enough
information to make a decision now.
13/02/10 @ 15:16 (+0100), thus spake Peter Otten:
> Ernest Adrogué wrote:
> > I'm designing a container class that supports slicing.
> > The problem is that I don't really know how to do it.
> > class MyClass(object):
> > def __init__(self, input_data):
> > self._data = transform_input(input_data)
> > def __getitem__(self, key):
> > if isinstance(key, slice):
> > # return a slice of self
> > pass
> > else:
> > # return a scalar value
> > return self._data[key]
> > The question is how to return a slice of self.
> > First I need to create a new instance... but how? I can't
> > use MyClass(self._data[key]) because the __init__ method
> > expects a different kind of input data.
> > Another option is
> > out = MyClass.__new__(MyClass)
> > out._data = self._data[key]
> > return out
> > But then the __init__ method is not called, which is
> > undesirable because subclasses of this class might need
> > to set some custom settings in their __init__ method.
> > So what is there to do? Any suggestion?
> (1) make transform_input() idempotent, i. e. ensure that
> transform_input(transform_input(data)) == transform_input(data)
> and construct the slice with MyClass(self._data[key])
> (2) require it to be invertible with
> inverse_transform_input(transform_input(data)) == data
> and make the slice with MyClass(inverse_transform_input(self._data[key]))
> Just stating the obvious...
More information about the Python-list