这个方法就是为了使实例对象可以以 对象[key] 的格式取值。
如果在类中定义了__getitem__()方法,那么他的实例对象(假设为P)就可以这样P[key]取值
而具体来说,P[key]究竟取到了什么值,在于__getitem__()方法是怎么写的。
根据其他几个博主的帖子,可以完全无厘头使用这个方法(主要是为了解释这个方法的作用)
比如:
cr 其他博主的解释
class DataTest:
def __init__(self,id,address):
self.id=id
self.address=address
self.d={self.id:1,
self.address:"192.168.1.1"
}
def __getitem__(self,key):
return "hello"
data=DataTest(1,"192.168.2.11")
print data[2]
# 输出结果为: hello
更多的关于这个方法的用法,似乎是与字典一起使用。
我是在FlowNet3D代码里看到的这个方法 (没有学过python,orz 不要嘲笑我),所以干脆用这个来理解一下,删去了和__getitem__无关的内容。
class SceneflowDataset():
def __init__(self):
self.cache = {}
self.cache_size = 30000
def __getitem__(self, index):
if index in self.cache:
pos1, pos2, color1, color2, flow, mask1 = self.cache[index]
else:
fn = self.datapath[index]
# datapath就是某一个目录里的若干制定格式的文件,比如1.npz,2.npz,3.npz
with open(fn, 'rb') as fp:
data = np.load(fp)
pos1 = data['points1']
pos2 = data['points2']
color1 = data['color1'] / 255
color2 = data['color2'] / 255
flow = data['flow']
mask1 = data['valid_mask1']
self.cache[index] = (pos1, pos2, color1, color2, flow, mask1)
return pos1_, pos2_, color1_, color2_, flow_, mask1_
self 的 cache 就是一个字典,假设 TRAIN_DATASE T是 SceneflowDataset 类的一个实例,那么在调用 TRAIN_DATASET[index] 语句时,会先检查 TRAIN_DATASET 的 cache 字典中有无 index 这一个键,如果有,取出这个键的值并返回。如果没有就去找到目录里的这个数据,存入cache,再返回。