Python 是否可以在_getitem上使用多个参数?

Python 是否可以在_getitem上使用多个参数?,python,Python,我正在尝试使用 __getitem__(self, x, y): 在我的Matrix类上,但在我看来它不起作用(我仍然不太清楚如何使用python)。 我这样称呼它: print matrix[0,0] 有可能使用多个参数吗?谢谢也许我只能使用一个参数,但可以将其作为元组传递?否,\uuu getitem\uuuu只接受一个参数(除了self)。对于矩阵[0,0],参数是元组(0,0) \uuuu getitem\uuuu只接受一个参数(而不是self),因此会传递一个元组 您可以这样做:

我正在尝试使用

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

print matrix[0,0]

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

否,
\uuu getitem\uuuu
只接受一个参数(除了
self
)。对于
矩阵[0,0]
,参数是元组
(0,0)

\uuuu getitem\uuuu
只接受一个参数(而不是
self
),因此会传递一个元组

您可以这样做:

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

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

获取1,2

查看for
对象。uuu getitem_uuu
了解更多信息。

事实上,当您执行
bla[x,y]
时,您调用的是
类型(bla)。uu getitem_uuuu(bla,(x,y))
--Python会自动为您形成元组,并将其作为第二个参数传递给
\uu getitem_uuuuuuu>(第一个参数是它自己的
)。没有好的方法[1]来表示
\uuu getitem\uu
需要更多参数,但也不需要



[1] 在Python
2.*
中,您实际上可以给
\uuuu getitem\uuuu
一个自动解包签名,当索引太多或太少时,该签名将引发
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个索引;-)。

我对3.x中参数解包的反对意见的理解并不是“圭多不认为这很好。“,但更多的是,几乎没有人知道该语言中存在该功能,这使编译器变得非常复杂。@Laurence,是的——复杂且很少使用->不好!)我经常使用它,它非常好,但问题是它使反射变得复杂。我将主要怀念它在lambda函数中的使用,就像这个实现一样。它让您了解所需元组的格式。我同意@Casebash。我来自C#/.Net,这里允许使用二级(三级等)参数。编译器的复杂性不一定是一个有效的论据,因为它本质上是另一种说法,“维护起来很痛苦”。特性意识是指教育用户“工具箱”中的可用内容。健壮的语言通常有一些“头痛”的特性,并且不是每个开发人员都知道(或者曾经需要使用)一些特性。因此,我们应该通过这些论点,将语言简化为普通程序员经常知道和使用的语言。