Search code examples
pythonstaticoperator-keywordmagic-methods

How to write a static python getitem method?


What do I need to change to make this work?

class A:
    @staticmethod
    def __getitem__(val):
        return "It works"

print A[0]

Note that I am calling the __getitem__ method on the type A.


Solution

  • When an object is indexed, the special method __getitem__ is looked for first in the object's class. A class itself is an object, and the class of a class is usually type. So to override __getitem__ for a class, you can redefine its metaclass (to make it a subclass of type):

    class MetaA(type):
        def __getitem__(cls,val):
            return "It works"
    
    class A(object):
        __metaclass__=MetaA
        pass
    
    print(A[0])
    # It works
    

    In Python3 the metaclass is specified this way:

    class A(object, metaclass=MetaA):
        pass