Python如何通过类名字符串跨模块获取指定类对象
问题根因
Python的目录形式包(带__init__.py的文件夹)被导入时,解释器默认只会执行包目录下的__init__.py文件,不会自动扫描、导入同目录下其他独立.py文件中定义的内容。
你当前能获取到folderc.py中定义的FolderC类,是因为该文件的内容已经被导入到了folderc包的命名空间中;但folderc_childa.py等其他子文件从未被主动导入,其中定义的类自然不会出现在folderc包的属性列表里,直接用getattr调用就会抛出属性不存在的错误。
修复方案
将需要通过包名直接访问的类,统一导入到folderc包目录下的__init__.py文件中即可。
示例配置(对应路径foldera/folderb1/folderc/__init__.py):
# 导入父类 from .folderc import FolderC # 导入各个子类实现 from .folderc_childa import FolderCChildA # 其余子类按相同格式追加导入即可 # from .folderc_childb import FolderCChildB
配置完成后,再执行getattr(foldera.folderb1.folderc, 'FolderCChildA')即可正常获取目标类对象,也可以直接遍历folderc包的属性,筛选得到所有需要的类列表。
如果后续子类实现数量较多、不想每次新增子类都手动修改__init__.py,也可以在__init__.py中编写动态扫描逻辑,自动遍历同目录下的.py文件导入符合命名规则的类;如果子类数量不多,手动显式导入可读性更高,也能避免误导出不需要对外暴露的内部实现类。
内容的提问来源于stack exchange,提问作者Taka Incur
相关产品推荐
相关产品推荐

