当在类中遇到嵌套列表时(更具体地说,我应该将其称为多变量函数),我可以将__getitem__
方法与两个或多个参数一起使用吗?
我知道这不是__getitem__
的典型用法,我应该把它写成课程的方法,但我真的想利用它的[]
功能。
答案 0 :(得分:1)
它根本不是非典型的; numpy一直都这么做。 __getitem__
接受一个论点;它可以是一个元组。你只需要自己解析元组。
class Indexer(object):
def __init__(self, *args, **kwargs):
pass
def __getitem__(self, item):
if isinstance(item, tuple):
# do special processing for tuples here
print(item)
# Everyone likes the number 3, so make sure to return an extra 3.
return [item, 3]
i = Indexer()
# this will print (2, 3), and got_item will have the value [(2, 3), 3]
got_item = i[2,3]
# This will print [(2, 3), 3]
print(got_item)
显然没有真正的理由返回[item, 3]
,但它只是证明__getitem__
内的代码可以做任何想做的事情。你可以回报任何你想要的东西。
每当Python解释器看到你索引某些内容时(如代码示例中的i[2, 3]
),它所做的第一件事就是用方括号之间的东西构建一个元组。您可以使用dis模块来检查这一点,该模块反汇编python代码以查看解释器的实际操作:
import dis
dis.dis('a[b, c]')
1 0 LOAD_NAME 0 (a)
3 LOAD_NAME 1 (b)
6 LOAD_NAME 2 (c)
9 BUILD_TUPLE 2
12 BINARY_SUBSCR
13 RETURN_VALUE
如果您以前从未见过来自dis的输出,那可能会有点混乱。重要的部分是BUILD_TUPLE
之前所说的BINARY_SUBSCR
。
这可能是一个太多的信息:重要的是你可以用__getitem__
做任何你想做的事。
答案 1 :(得分:0)
__getitem__
接受尽可能多的参数,因为它们被打包为元组。请参阅以下示例,其中类中的嵌套列表存储在_data
中,并使用某些维度进行初始化。
class Table(object):
def __init__(self, dimx, dimy, initialize=0):
self._dimx = dimx
self._dimy = dimy
self._data = [[initialize] * self._dimx] * self._dimy
def __getitem__(self, *args):
idx = args[0]
return self._data[idx[0]][idx[1]]
def __setitem__(self, *args):
idx = args[0]
self._data[idx[0]][idx[1]] = args[1]
使用此课程,您只需执行以下操作:
t = Table(10, 1)
t[0, 1] = 'a'
print(t[0, 0])
print(t[0, 1])
......它会产生:
0
a