15

我需要改变什么才能使这项工作?

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

print A[0]

请注意,我__getitem__在 type 上调用该方法A

4

2 回答 2

30

索引对象时__getitem__,首先在对象的类中查找特殊方法。一个类本身就是一个对象,而一个类的类通常是type. 因此,要覆盖__getitem__一个类,您可以重新定义它的元类(使其成为 的子类type):

class MetaA(type):
    def __getitem__(cls,val):
        return "It works"

class A(object):
    __metaclass__=MetaA
    pass

print(A[0])
# It works

在 Python3 中,元类是这样指定的:

class A(object, metaclass=MetaA):
    pass
于 2011-05-31T13:03:16.570 回答
11

Python 3.7 引入了__class_getitem__.

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

print(A[0])
于 2020-08-30T23:52:10.227 回答