如何在类方法内部使用自身方法名?无需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,能拿到当前栈帧的代码对象,从中提取方法名:
注意:这个方法依赖CPython实现,在PyPy等其他Python解释器中可能无法使用,不推荐在生产代码中依赖。import sys print(sys._getframe().f_code.co_name) # 输出: boo - 通过
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
相关产品推荐
相关产品推荐

