如何在Python中导入自定义脚本后遍历其中的所有类
遍历导入模块内自定义类的实现方案
不需要借助第三方库,仅通过Python标准库即可实现你需要的类遍历逻辑,核心是扫描目标模块的命名空间,筛选出符合要求的类对象,避免无关对象的干扰。
推荐实现(使用标准库inspect,准确率最高)
inspect是Python内置的模块内省工具,可以精准判断对象的类型与定义来源,适配绝大多数开发场景,对应myscript.py的完整实现如下:
# myscript.py import foo import inspect # 筛选foo模块内直接定义的所有类 foo_internal_classes = [ obj for _, obj in inspect.getmembers(foo) # 两层判断:首先判断是类对象,其次确认类的定义源就是foo模块本身 if inspect.isclass(obj) and inspect.getmodule(obj) == foo ] # 遍历所有筛选到的类执行自定义逻辑 for cls in foo_internal_classes: # 在此处编写处理逻辑,比如打印类名、实例化、执行类方法等 print(f"当前遍历到的类:{cls.__name__}")
针对你给出的示例foo.py,运行上述代码时,导入foo模块就会触发类定义阶段的打印输出,完成筛选后会依次遍历识别出的a、b、c三个自定义类。
简化实现(无额外模块依赖)
如果不想导入inspect模块,也可以直接通过模块的内置命名空间属性实现筛选,逻辑和上述方案完全一致:
# myscript.py import foo foo_internal_classes = [ value for value in foo.__dict__.values() # 判断逻辑:值是类对象,且类的所属模块名和当前foo模块的名称完全匹配 if isinstance(value, type) and value.__module__ == foo.__name__ ] for cls in foo_internal_classes: # 自定义处理逻辑 pass
注意事项
- 两个方案都做了类来源的判断,不会把foo.py中从其他模块导入的第三方类、内置类型误统计为自定义类。如果需要统计全部类对象(包含导入的类),可以去掉代码里的模块来源判断条件。
- 针对你提供的示例场景,两种方案都可以准确识别所有自定义类,不需要安装任何外部依赖。
内容的提问来源于stack exchange,提问作者sss
相关产品推荐
相关产品推荐

