如何从类实例获取其所属模块的名称与目录路径?
从类实例获取模块名称和目录路径的实现方案
当然可以搞定这个需求!刚好能解决你用pickle加载实例时需要确认类来源的问题,我来一步步给你说清楚怎么做:
一、核心思路
每个类实例都自带和类、模块相关的属性,我们只需要逐层获取这些属性,再结合系统模块和路径处理工具就能拿到想要的信息。
二、具体实现步骤
1. 获取模块名称
有两种常用方式,效果完全一致:
- 直接通过实例的类对象取
__module__属性:# 假设b是你的类实例 module_name = b.__class__.__module__ - 结合
sys.modules获取模块对象再取名称(就是你尝试的@albar方案的完整写法):import sys module_obj = sys.modules[b.__class__.__module__] module_name = module_obj.__name__
2. 获取模块的目录路径
拿到模块对象后,通过它的__file__属性获取模块对应的文件路径,再用os.path工具提取目录:
import os # 先拿到模块的绝对文件路径 module_file_path = os.path.abspath(module_obj.__file__) # 提取目录路径 module_dir = os.path.dirname(module_file_path)
三、结合你的场景的完整示例
用你提到的Model_physio_moyen模块和pop_Sigmoid_outside_noise类来写完整代码:
import sys import os from Models import Model_physio_moyen # 实例化你的类(注意这里要加括号创建实例哦) b = Model_physio_moyen.pop_Sigmoid_outside_noise() # 获取模块名称 module_name = b.__class__.__module__ print(f"模块名称: {module_name}") # 获取模块目录路径 module_obj = sys.modules[module_name] module_file = os.path.abspath(module_obj.__file__) module_directory = os.path.dirname(module_file) print(f"模块目录路径: {module_directory}")
四、需要注意的细节
- 如果是Python内置模块(比如
math、datetime),它们的__file__属性可能不存在,但你的场景是自己编写的模块,所以不用担心这个问题; - 如果你用的是包(带有
__init__.py的目录),这种方式拿到的是包内对应模块文件的目录,也就是类所在的具体模块的路径; - 当你加载pickle保存的实例时,只需要在加载后执行上述代码,就能直接获取该实例的类来源信息,完美适配你跨软件加载的需求。
内容的提问来源于stack exchange,提问作者ymmx
相关产品推荐
相关产品推荐

