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

时间:2009-11-06 04:21:49

标签: python

我正在尝试使用

__getitem__(self, x, y):

在我的Matrix类上,但在我看来它不起作用(我仍然不太清楚使用python)。 我这样称呼它:

print matrix[0,0]

是否可以使用多个参数?谢谢。也许我只能使用一个参数但将其作为元组传递?

3 个答案:

答案 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__提供一个自动解包签名,当您启动时,该签名会引发ValueErrorTypeError用索引太多或太少索引......:

>>> 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)