36
votes

I'd like to be able to access some values of a python object using array-like syntax, ie:

obj = MyClass()
zeroth = obj[0]
first = obj[1]

Is this possible? If so, how do you implement this in the python class in question?

2
Apparently, for those googling, this is called 'indexing'. - PeterJCLaw
Unless lists are that way in python (not sure - I rarely use it), maybe you should put indexing in the title instead of list? - Merlyn Morgan-Graham
@Merlyn, lists are indeed like that, and more. Added anyway. - PeterJCLaw

2 Answers

54
votes

You need to write or override __getitem__, __setitem__, and __delitem__.

So for example:

class MetaContainer():
    def __delitem__(self, key):
        self.__delattr__(key)
    def __getitem__(self, key):
        return self.__getattribute__(key)
    def __setitem__(self, key, value):
        self.__setattr__(key, value)

This is a very simple class that allows indexed access to its attributes.

5
votes

Use the __getitem__ and __setitem__ methods.

class MyClass:
    def __getitem__(self, key):
        return some_value_related_to_key

    def __setitem__(self, key, value):
        # set value (if needed)