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

如何在类方法内部使用自身方法名?无需self.boo获取"A.boo"的更佳方案

关于Python中获取方法名称的两个问题解答

1. 如何在类方法内部使用该方法自身的名称?

你可以通过几种实用方式获取类方法自身的名称,结合你的代码逐一说明:

  • 使用__name__属性:通过绑定方法的__name__能拿到方法的短名称,比如在boo方法里:
    print(self.boo.__name__)  # 输出: boo
    
  • 使用__qualname__属性:这个属性会返回包含类名的限定名称,能有效区分不同类中同名的方法:
    print(self.boo.__qualname__)  # 输出: A.boo
    
  • 通过sys._getframe()获取:这是CPython的私有API,能拿到当前栈帧的代码对象,从中提取方法名:
    import sys
    print(sys._getframe().f_code.co_name)  # 输出: boo
    
    注意:这个方法依赖CPython实现,在PyPy等其他Python解释器中可能无法使用,不推荐在生产代码中依赖。
  • 通过traceback模块:可以从调用栈中提取当前方法的信息:
    import traceback
    print(traceback.extract_stack()[-2])  # 输出类似: ('test.py', 16, 'boo', None)
    
    元组里的第三个元素就是方法名称。

2. 不使用self.boo的情况下获取字符串"A.boo"

如果不想通过self.boo来获取限定名称,这里有两种更合适的实现方式:

方法一:结合类名和栈帧方法名拼接

import sys
class A:
    def boo(self):
        method_name = sys._getframe().f_code.co_name
        qual_name = f"{self.__class__.__name__}.{method_name}"
        print(qual_name)  # 输出: A.boo
A().boo()

注意:如果子类继承了A的boo方法,self.__class__.__name__会显示子类名称而非A;若需要获取方法定义时的原始类名,得用下面的方法。

方法二:使用inspect模块(更稳妥兼容)

inspect模块提供了官方支持的方式,无需依赖私有API,兼容性更好:

import inspect
class A:
    def boo(self):
        frame = inspect.currentframe()
        try:
            # 获取当前方法的名称
            func_name = inspect.getframeinfo(frame).function
            # 从类属性中拿到方法对象,再取限定名称
            qual_name = getattr(self.__class__, func_name).__qualname__
            print(qual_name)  # 输出: A.boo
        finally:
            # 手动释放帧引用,避免内存泄漏
            del frame
A().boo()

这个方法即使在子类继承且未重写方法的场景下,也能正确获取方法定义时的原始类名(即A.boo)。

额外提示

__qualname__是Python 3.3及以上版本才有的属性,现在绝大多数运行环境都支持该版本,无需担心兼容性问题。


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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.26 09:04:44