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
相关产品推荐
相关产品推荐

