如何让 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__