凡是在类中定义了这个getitem 方法,那么它的实例对象(假定为p),可以像这样p[key] 取值,当实例对象做p[key] 运算时,会调用类中的方法getitem


一般如果想使用索引访问元素时,就可以在类中定义这个方法(getitem(self, key) )。

先用一个夸张一点的例子来说明这个问题。

getitem()

我们使用了getitem()之后,我们就可以对类实现引用,

  1. def __getitem__(self, idx):
  2. img_name = self.img_path[idx]
  3. img_item_path = os.path.join(self.root_dir,self.label_dir,img_name)
  4. img = Image.open(img_item_path)
  5. label = self.label_dir
  6. return img,label

这里我们重写了getitem()类

当我们对MyData使用[]索引的时候,就会调用getitem()类,

getitem()返回的结果,就是我们得到的输出。

这里我们返回的是,img和label

  1. ants_dataset = MyData(root_dir,ants_label_dir)
  2. ants_dataset[0]
  3. Out[7]:
  4. (<PIL.JpegImagePlugin.JpegImageFile image mode=RGB size=768x512 at 0x279B5A9BE80>,
  5. 'ants')
  6. ants_0 = ants_dataset[0]
  7. ants_dataset[1]
  8. Out[9]:
  9. (<PIL.JpegImagePlugin.JpegImageFile image mode=RGB size=500x333 at 0x279D2390940>,
  10. 'ants')

这里
ants_dataset[1]的输出是
(,
‘ants’)

这里用括号括起来,说明是一个元组,里面有两个元素,

‘ants’

正好对应了getitem()的两个返回值img,label