我正在尝试使用
__getitem__(self, x, y):
在我的Matrix类上,但在我看来它不起作用(我仍然不太清楚使用python)。 我这样称呼它:
print matrix[0,0]
是否可以使用多个参数?谢谢。也许我只能使用一个参数但将其作为元组传递?
答案 0 :(得分:44)
__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
有关详细信息,请参阅http://docs.python.org/reference/datamodel.html#object.getitem
答案 1 :(得分:22)
确实,当你执行bla[x,y]
时,你正在调用type(bla).__getitem__(bla, (x, y))
- Python会自动为你创建元组并将其传递给__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 vs 3个指数; - )。
答案 2 :(得分:3)
不,__getitem__
只接受一个参数(除self
之外)。在matrix[0, 0]
的情况下,参数是元组(0, 0)
。