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

Python中获取当前执行类方法所属的模块与类信息

获取类方法所属的模块名、类名及方法名

针对你给出的some.module模块中的MyClass.method类方法,以下是几种直接获取目标信息的方案:

方案一:利用类方法的cls参数 + 轻量工具函数

因为类方法的第一个参数cls就是当前类的对象,我们可以直接从它身上拿到模块名和类名,再结合简单方法获取当前方法名:

import inspect

class MyClass:
    @classmethod
    def method(cls):
        # 获取模块名
        module_name = cls.__module__
        # 获取类名
        class_name = cls.__name__
        # 获取当前方法名(inspect规范方式)
        method_name = inspect.stack()[0].function
        
        # 输出目标信息
        print(f"模块:{module_name}")
        print(f"类:{class_name}")
        print(f"方法:{method_name}")
        # do something
        pass

如果不想引入inspect模块,也可以用Python内部接口获取方法名(注意:sys._getframe是CPython实现细节,跨解释器可能不兼容):

import sys

class MyClass:
    @classmethod
    def method(cls):
        module_name = cls.__module__
        class_name = cls.__name__
        method_name = sys._getframe().f_code.co_name
        
        print(f"模块:{module_name}")
        print(f"类:{class_name}")
        print(f"方法:{method_name}")
        pass

方案二:用inspect模块的进阶方法

如果需要完整的调用栈上下文,可使用inspect.currentframe获取信息,同时手动管理帧引用避免内存泄漏:

import inspect

class MyClass:
    @classmethod
    def method(cls):
        frame = inspect.currentframe()
        try:
            method_name = frame.f_code.co_name
            module_name = cls.__module__
            class_name = cls.__name__
        finally:
            del frame
        
        print(f"模块:{module_name}")
        print(f"类:{class_name}")
        print(f"方法:{method_name}")
        pass

关键说明

  • 模块名:类对象的__module__属性是最可靠的来源,直接返回定义该类的模块全称(如示例中的some.module)。
  • 类名:类对象的__name__属性直接返回类的名称,无需解析栈信息。
  • 方法名:优先使用inspect.stack()[0].function,符合Python规范;若追求性能可选用inspect.currentframe().f_code.co_name,但需注意手动释放帧引用。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.17 02:37:11