Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

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.

like image 842
Woltan Avatar asked May 31 '11 12:05

Woltan


2 Answers

Python 3.7 introduced __class_getitem__.

class A:
    def __class_getitem__(cls, key):
        return "It works"

print(A[0])
like image 42
Cruise Liu Avatar answered Oct 31 '22 03:10

Cruise Liu


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
like image 100
unutbu Avatar answered Oct 31 '22 05:10

unutbu