如何让 Python 2 的 __getitem__ 在类上工作? [复制]

Posted

技术标签:

【中文标题】如何让 Python 2 的 __getitem__ 在类上工作? [复制]【英文标题】:How to make Python 2's __getitem__ work on a class? [duplicate] 【发布时间】:2014-06-15 16:47:01 【问题描述】:

我如何进行项目访问,即。 __getitem__ 在 Python 2.x 中的类对象上可用?

我试过了:

class B:
    @classmethod
    def __getitem__(cls, key):
        raise IndexError

测试:

B[0]
# TypeError: 'classobj' object has no attribute '__getitem__'
print B.__dict__
#  ... '__getitem__': <classmethod object at 0x024F5E70>

我如何让__getitem__ 对班级本身起作用?

【问题讨论】:

您必须在 metaclass 上放置特殊方法。 @MartijnPieters 我没能找到这个问题,谢谢马丁。虽然我的B是old-style class,但是这里重要的是我看到的特殊方法。 旧式类也不支持@classmethod 装饰器(或任何其他描述符)。 @MartijnPieters 那时我犯了一个错误。但我想知道,我的装饰器在这里会发生什么?我的类是否仍然是老式的,装饰器是否被忽略。 【参考方案1】:

作为Martijn Pieters 的pointed out,人们可能想在这里为special methods lookup 定义一个元类。

如果你可以使用新式类(或者不知道那是什么):

class Meta_B(type):
    def __getitem__(self, key):
        raise IndexError
#

class B(object):
    __metaclass__ = Meta_B
#

测试

B[0]
# IndexError, as expected

【讨论】:

以上是关于如何让 Python 2 的 __getitem__ 在类上工作? [复制]的主要内容,如果未能解决你的问题,请参考以下文章

python中如何实现__getitem__ dunder方法获取属性值?

python之使用魔术方法__getitem__和__len__

python的__getitem__

python魔法函数之__getitem__

python学习之__getitem__,__setitem__,__delitem__

python - __setitem__/__getitem__/__delitem__类的内置方法