Python 实现_ugetItem__
有没有一种方法可以实现Python 实现_ugetItem__,python,Python,有没有一种方法可以实现\uuuu getitem\uuuu以支持整数和切片索引的方式,而无需手动检查参数的类型 我看到了很多这种形式的例子,但对我来说它似乎很粗糙 def __getitem__(self,key): if isinstance(key,int): # do integery foo here if isinstance(key,slice): # do slicey bar here 另一方面,为什么这个问题首先存在?有时返回int,有时返回slice
\uuuu getitem\uuuu
以支持整数和切片索引的方式,而无需手动检查参数的类型
我看到了很多这种形式的例子,但对我来说它似乎很粗糙
def __getitem__(self,key):
if isinstance(key,int):
# do integery foo here
if isinstance(key,slice):
# do slicey bar here
另一方面,为什么这个问题首先存在?有时返回int,有时返回slice是一种奇怪的设计。调用
foo[4]
应该调用foo.\uu getitem\uuuuuuuu(slice(4,5,1))
或类似的方法。您可以使用异常处理;假设key
是一个slice
对象,并对其调用index()
方法。如果失败,则它必须是一个整数:
def __getitem__(self, key):
try:
return [self.somelist[i] * 5 for i in key.indices(self.length)]
except AttributeError:
# not a slice object (no `indices` attribute)
return self.somelist[key] * 5
大多数自定义容器的用例不需要支持切片,而且历史上,\uuuu getitem\uuuu
方法只需要处理整数(即序列);那家公司是来处理切片的。当\uuuu getslice\uuuu
被弃用时,为了向后兼容和更简单的API,让\uuuu getitem\uuuuu
处理整数和slice
对象更容易
这忽略了一个事实,即在序列外部,
key
不必是整数。自定义类可以自由支持它们喜欢的任何键类型。key
不必是整数,因此尝试将其强制到切片中会有点奇怪。啊哈,这是一种很好的python方法。与其测试对象的类型,不如测试它是否有特定的方法,即duck类型的本质。(虽然我认为我会使用getattr而不是捕获异常)显然,我有一个切片和索引的用例,否则我不会问这个问题。。。