可以在__getitem__中使用多个参数吗?
我正在尝试在我的矩阵类中使用
__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__
设置一个自动解包的签名,这样在用的索引数量不对时会抛出 ValueError
或 TypeError
错误……:
>>> 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__
的详细说明。