Python如何获取类内部定义的指定类型的所有实例对象
解决方法
你可以通过遍历类实例的属性字典,结合isinstance()类型判断实现需求,不需要依赖全局变量检索的方案。
具体实现逻辑如下:
- 先获取目标实例的所有属性键值对,可通过内置的
__dict__属性直接读取 - 遍历所有属性值,用
isinstance(值, 指定类)筛选符合类型的对象即可
示例代码
class Bar: def __init__(self, name): self.hellomsg = 'hello ' + name class Foo: def __init__(self): self.mymsg1 = Bar('John Doe') self.mymsg2 = Bar('Jane Doe') self.somenumber = 42 self.somewords = 'hello world' # 实例化Foo foo_inst = Foo() # 筛选所有Bar类型的属性值 bar_instances = [attr_val for attr_name, attr_val in foo_inst.__dict__.items() if isinstance(attr_val, Bar)] # 测试输出 for bar in bar_instances: print(bar.hellomsg)
运行后输出:
hello John Doe hello Jane Doe
如果需要同时保留属性名和对应的实例,可以把列表生成式改成字典:
bar_instance_dict = {attr_name: attr_val for attr_name, attr_val in foo_inst.__dict__.items() if isinstance(attr_val, Bar)} print(bar_instance_dict.keys()) # 输出 dict_keys(['mymsg1', 'mymsg2'])
兼容场景说明
如果Foo类设置了__slots__属性限制可声明的属性,没有默认的__dict__的话,可以改用dir()函数遍历属性名,再用getattr()获取值判断,代码调整如下:
bar_instances = [] for attr_name in dir(foo_inst): # 过滤掉私有方法/属性,只检索公开属性 if not attr_name.startswith('_'): attr_val = getattr(foo_inst, attr_name) if isinstance(attr_val, Bar): bar_instances.append(attr_val)
以上方案只会检索当前实例的直接属性,不会递归检索属性内部嵌套的Bar实例,如果需要递归筛选,自行补充递归逻辑即可。
内容的提问来源于stack exchange,提问作者theChef613
相关产品推荐
相关产品推荐

