【发布时间】:2015-02-11 11:58:09
【问题描述】:
>>> class Thing(object):
... def __index__(self):
... return 1
...
>>> thing = Thing()
>>> list_ = ['abc', 'def', 'ghi']
>>> list_[thing]
'def'
>>> dict_ = {1: 'potato'}
>>> dict_[thing]
# KeyError
thing 如何知道在被列表访问时将自己表示为 1,而不是被字典访问?两种魔术方法都不通过__getitem__吗?列表中显示的用法可以通过 __int__ 而不是,那么 __index__ 的存在理由是什么?
【问题讨论】:
-
有关
__index__方法的完整推理,您可以阅读PEP 357。基本上,__int__将结果强制转换为整数类型。想象一下,如果你写了类似x[3.2:5.8]的东西。这应该会引发错误,而在 Python 中确实会引发错误。但是,如果索引逻辑使用__int__,它会将切片值强制为3和5,并且代码不会引发错误。
标签: python magic-methods