Python - 根据属性的值查找类的实例

时间:2018-03-01 09:27:25

标签: python class instance

我想找到一个类的实例,其中一个属性具有一定的值:

import numpy as np
import inspect
import matplotlib.pyplot as plt

class Frame():
    def __init__(self, img, idx):
        self.image = img
        self.idx = idx

for i in range(10):
    img = np.random.randint(0, high=255, size=(720, 1280, 3), dtype=np.uint8) # generate a random, noisy image
    Frame(img, i)

# Pseudo Code below:
frame = inspect.getmembers(Frame, idx=5) # find an instance of a class where the index is equal to 5
plt.imshow(frame.img)

2 个答案:

答案 0 :(得分:1)

从你的例子中看起来你混合了两件事:定义一个Frame对象(包含一个图像)和定义一个Frames集合(包含多个框架,索引,以便你可以根据自己的喜好访问它们)。

所以它看起来像xy问题:你可能只需要在字典/列表类型的集合中保存Frame实例,然后访问你需要的Frame。

无论如何,您可以使用getattr访问对象属性的值。

all_frames = []

for i in range(10):
    img = np.random.randint(0, high=255, size=(720, 1280, 3), dtype=np.uint8) # generate a random, noisy image
    all_frames.append(Frame(img, i))

frames_to_plot = [frame for frame in all_frames if getattr(frame, index) == 5]

for frame in frames_to_plot:
    plt.imshow(frame.img)

答案 1 :(得分:1)

假设class

class Frame():
    def __init__(self, img, idx):
        self.image = img
        self.idx = idx

和两个实例:

a = Frame('foo', 1)
b = Frame('bar', 2)

您可以找到idx=1之类的那样:

import gc


def find_em(classType, attr, targ):
    return [obj.image for obj in gc.get_objects() if isinstance(obj, classType) and getattr(obj, attr)==targ]

print(find_em(Frame, 'idx', 1))  # -> ['foo']

请注意,如果你有一个包含大量在内存中创建的对象的大代码,那么gc.get_objects()会很大,因此这种方法相当缓慢且效率低下。我从here得到的gc.get_objects()想法。

这会回答你的问题吗?