我有很长的文件路径列表,例如:
images = ['path/to/1.png', 'path/to/2.png']
Run Code Online (Sandbox Code Playgroud)
我知道我可以将此列表包装在map迭代器中,该迭代器提供对通过函数映射的列表中的项的顺序访问,如:
image_map = map(cv2.imread, images)
Run Code Online (Sandbox Code Playgroud)
然后,当我迭代列表时,我可以懒洋洋地加载这些图像文件:
next(image_map)
=> pixels
Run Code Online (Sandbox Code Playgroud)
但我希望随机访问原始列表,通过我的map函数映射:
image_map[400]
=> pixels
Run Code Online (Sandbox Code Playgroud)
我不想将它转换为a list,因为这会将我的所有图像加载到内存中,并且它们不适合内存:
# Bad:
list(image_map)[400]
Run Code Online (Sandbox Code Playgroud)
考虑这个的另一种方式可能是装饰者list.__getitem__.
我知道我可以对列表进行子类化,但我真的希望有一种更清晰的方法.
为什么不创建一个访问器类呢?
class ImageList(object):
def __init__(self, images):
self.images = images
def get_image(self, image_num):
return cv2.imread(self.images[image_num])
Run Code Online (Sandbox Code Playgroud)
您当然也可以缓冲读取的图像。
您还可以提供一种__getitem__方法来进行类似列表的访问:
def __getitem__(self, key):
return cv2.imread(self.images[key])
Run Code Online (Sandbox Code Playgroud)
用法:
images = ['path/to/1.png', 'path/to/2.png']
image_list = ImageList(images)
image = image_list.get_image(400) # the same as
image = image_list[400] # this
Run Code Online (Sandbox Code Playgroud)
顺便说一句:当然你可以子类化list,但在 Python 社区中,更明确的方式更受青睐。这里更清楚的是有一个单独的类而不是子类list。过度使用继承也不是最好的风格。