views:

138

answers:

3

Hi,

I have been looking for the function name to override to overload the [] operator. Could anyone help?

Thanks

+11  A: 

You need to use the __getitem__ method.

>>> class MyClass:
...     def __getitem__(self,index):
...         return index * 2
...
>>> myobj = MyClass()
>>> myobj[3]
6

And if you're going to be setting values you'll need to implement the __setitem__ method too, otherwise this will happen:

>>> myobj[5] = 1
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
AttributeError: MyClass instance has no attribute '__setitem__'
Dave Webb
Thanks. This is really cool!
Sahasranaman MS
+5  A: 

You are looking for the __getitem__ method. See http://docs.python.org/reference/datamodel.html, section 3.4.5

Confusion
+8  A: 

To fully overload it you also need to implement the __setitem__and __delitem__ methods.

edit

I almost forgot... if you want to completely emulate a list, you also need __getslice__, __setslice__ and __delslice__.

There are all documented in http://docs.python.org/reference/datamodel.html

Dave Kirby
Thanks Dave. That was really helpful.
Sahasranaman MS
`__getslice__, `__setslice__` and `__delslice__' have been deprecated for the last few releases of ver 2.x (not sure exactly when), and are no longer supported in ver 3.x. Instead, use `__getitem__`. `__setitem__` and `__delitem__' and test if the argument is of type `slice`, i.e.: `if isinstance(arg, slice): ...
Don O'Donnell