可以在__getitem__中使用多个参数吗?

55 投票
5 回答
24625 浏览
提问于 2025-04-15 15:43

我正在尝试在我的矩阵类中使用

__getitem__(self, x, y):

但是我觉得它似乎不太好用(我对Python还不是很熟悉)。我这样调用它:

print matrix[0,0]

请问真的可以使用多个参数吗?谢谢。也许我可以只用一个参数,但把它当作一个元组传递?

5 个回答

5

不,__getitem__ 只需要一个参数(除了 self 之外)。在 matrix[0, 0] 这个例子中,参数就是元组 (0, 0)

34

确实,当你执行 bla[x,y] 时,其实是在调用 type(bla).__getitem__(bla, (x, y))。Python 会自动把 (x, y) 这个元组给你生成好,然后把它作为第二个参数传给 __getitem__,第一个参数是 self。没有好的方法[1]来表示 __getitem__ 需要更多的参数,但其实也没必要。



[1] 在 Python 2.* 中,你可以给 __getitem__ 设置一个自动解包的签名,这样在用的索引数量不对时会抛出 ValueErrorTypeError 错误……:

>>> class X(object):
...   def __getitem__(self, (x, y)): return x, y
... 
>>> x = X()
>>> x[23, 45]
(23, 45)

至于这是否算是“好方法”,就见仁见智了……在 Python 3 中这个功能已经被弃用了,所以你可以推测 Guido 在深思熟虑后并不认为它是 的选择;-)。自己进行解包(在签名中只用一个参数)其实没什么大不了的,这样可以让你提供更清晰的错误信息(而且都是统一的,而不是因为用 1 个索引和 3 个索引时出现不同类型的错误信息,这两者其实是很相似的错误;-)。

90

__getitem__ 这个方法只接受一个参数(除了 self 以外),所以你会得到一个元组。

你可以这样做:

class matrix:
    def __getitem__(self, pos):
        x,y = pos
        return "fetching %s, %s" % (x, y)

m = matrix()
print m[1,2]

输出结果

fetching 1, 2

想了解更多信息,可以查看 文档,里面有关于 object.__getitem__ 的详细说明。

撰写回答