如何获取指定Python文件内定义的类,排除导入类并替换弃用的imp模块
解决方案
实现思路
- 替换已弃用的
imp模块:使用Python官方推荐的importlib相关方法加载指定路径的Python文件为模块,功能完全兼容旧版imp.load_source。 - 过滤导入的外部类:通过判断类的
__module__属性与当前加载的模块名是否一致,筛选出仅在目标文件中定义的类:导入的外部类的__module__会指向它原本所属的模块名,只有当前文件内定义的类才会和加载的模块名匹配。
可直接运行的实现代码
兼容Python3.4+版本
import importlib.machinery import inspect # 加载指定路径的a.py为模块 loader = importlib.machinery.SourceFileLoader("__inspected__", './a.py') module = loader.load_module() class_members = inspect.getmembers(module, inspect.isclass) for cls_name, cls_obj in class_members: # 仅保留当前模块内定义的类 if cls_obj.__module__ == module.__name__: print(cls_name)
适配Python3.6+无弃用警告版本
import importlib.util import inspect import os file_path = './a.py' module_name = "__inspected__" # 构建模块规范 spec = importlib.util.spec_from_file_location(module_name, os.path.abspath(file_path)) module = importlib.util.module_from_spec(spec) spec.loader.exec_module(module) class_members = inspect.getmembers(module, inspect.isclass) for cls_name, cls_obj in class_members: if cls_obj.__module__ == module_name: print(cls_name)
运行效果
执行上述代码后,仅会输出MyClass,不会打印从c.py导入的CClass,符合需求。
内容的提问来源于stack exchange,提问作者Edgar Navasardyan
相关产品推荐
相关产品推荐

