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 に答える