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

dev*_*ium 26 python

我正在尝试使用

__getitem__(self, x, y):
Run Code Online (Sandbox Code Playgroud)

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

print matrix[0,0]
Run Code Online (Sandbox Code Playgroud)

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

Chr*_*Lee 51

__getitem__ 只接受一个参数(除了self),所以你传递了一个元组.

你可以这样做:

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

m = matrix()
print m[1,2]
Run Code Online (Sandbox Code Playgroud)

输出

fetching 1, 2
Run Code Online (Sandbox Code Playgroud)

请参阅http://docs.python.org/reference/datamodel.html#object.getitem了解更多信息


Ale*_*lli 23

实际上,当你执行时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)
Run Code Online (Sandbox Code Playgroud)

这种"好方法"是否没有实际意义......它已经在Python 3中被弃用了,所以你可以推断出Guido并不认为它在长时间的反思中是好的 ;-).做你自己的解包(签名中的单个参数)没什么大不了的,可以让你提供更清晰的错误(而不是那些不同类型的错误,因为索引这样一个实例的非常相似的错误,例如,1 vs 3个指数;-).

  • 我经常使用它,它非常好,但问题是它复杂的反射.我主要想念它在lambda函数中的用法 (2认同)

Mik*_*ham 5

不,__getitem__只需要一个参数(除了self)。在 的情况下matrix[0, 0],参数是元组(0, 0)