Suppose following class:
class Class(object):
@classmethod
def getitem(*args):
print \'getitem %s\' % (args,)
@classmethod
def __geti
When you call x[test], the interpreter inspects type(x) for the __getitem__ attribute. In case of Class[test] it's the Class's metaclass, i.e. type. If you want to have a class-wide __getitem__, define it inside a new metaclass. (Needless to say, that's a sort of magic, as anything you do with metaclasses)
class Meta(type):
def __getitem__(self, arg):
print "__getitem__:", arg
class X(object):
__metaclass__ = Meta
X['hello'] # output: __getitem__ hello