如何获取Python实例化对象的所属类及模块名称?
如何获取对象实例化时的类与模块信息
可以通过Python的inspect模块分析调用栈上下文,获取对象实例化时所在的类名称和模块名称。以下是针对不同场景的实现方案:
核心实现思路
利用inspect模块获取调用栈帧,从帧的上下文信息中提取模块名,再根据实例化的场景(类属性定义、类方法内部、模块级别)确定所在类名。
完整代码示例
import inspect class cool_ice: def __init__(self): # 遍历调用栈,跳过当前__init__方法的帧 for frame_info in inspect.stack()[1:]: frame = frame_info.frame module_name = frame.f_globals['__name__'] instantiating_class = None # 场景1:在类的实例方法/类方法中实例化 if 'self' in frame.f_locals: instantiating_class = frame.f_locals['self'].__class__.__name__ # 场景2:在类定义阶段(类属性)实例化 else: # 通过类的__dict__匹配当前帧的局部命名空间,找到正在定义的类 for name, obj in frame.f_globals.items(): if inspect.isclass(obj) and obj.__dict__ is frame.f_locals: instantiating_class = name break # 输出结果 if instantiating_class: print(f"实例化发生在{instantiating_class}类中,所属模块为{module_name}。") else: print(f"实例化发生在模块{module_name}中,未在类内。") # 找到目标帧后停止遍历 break # 清理栈帧引用,避免内存泄漏 del frame_info, frame # 测试场景1:类属性中实例化 class A: obj = cool_ice() # 测试场景2:实例方法中实例化 class B: def create_obj(self): self.obj = cool_ice() b = B() b.create_obj() # 测试场景3:模块级别实例化 obj_in_module = cool_ice()
代码说明
- 调用栈分析:
inspect.stack()获取当前调用的栈帧列表,跳过__init__自身的帧,遍历上层帧获取上下文。 - 模块名获取:从帧的
f_globals字典中直接提取__name__,即当前模块的名称。 - 类名匹配:
- 若在类方法中实例化,帧的
f_locals中会存在self,通过self.__class__.__name__直接获取类名。 - 若在类定义阶段(类属性)实例化,此时类尚未完全创建完成,通过匹配类的
__dict__与帧的f_locals(类的属性字典)找到对应的类名。
- 若在类方法中实例化,帧的
内容的提问来源于stack exchange,提问作者dataviews
相关产品推荐
相关产品推荐

