You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何获取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()

代码说明

  1. 调用栈分析:inspect.stack()获取当前调用的栈帧列表,跳过__init__自身的帧,遍历上层帧获取上下文。
  2. 模块名获取:从帧的f_globals字典中直接提取__name__,即当前模块的名称。
  3. 类名匹配:
    • 若在类方法中实例化,帧的f_locals中会存在self,通过self.__class__.__name__直接获取类名。
    • 若在类定义阶段(类属性)实例化,此时类尚未完全创建完成,通过匹配类的__dict__与帧的f_locals(类的属性字典)找到对应的类名。

内容的提问来源于stack exchange,提问作者dataviews

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.17 18:10:31