You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.05 10:27:03