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

如何在子类调用父类类方法时获取子类类名(无需重写)

解决方案:使用类方法实现动态类绑定

这问题我熟!核心是你现在的methodA是个普通函数,没有和调用它的类绑定,所以__class__只会指向定义它的A类。要实现你要的效果,只需要把methodA改成类方法就行,不用在B里重写任何代码,甚至把A设为抽象类也完全兼容。

修改后的代码

普通类版本

class A(object):
    @classmethod
    def methodA(cls):
        print(cls)

class B(A):
    pass

B.methodA()  # 输出 <class '__main__.B'>

抽象类版本(如果需要)

from abc import ABC

class A(ABC):
    @classmethod
    def methodA(cls):
        print(cls)

class B(A):
    pass

B.methodA()  # 同样输出 <class '__main__.B'>

原理说明

  • @classmethod装饰器会让方法自动接收调用它的类作为第一个参数(约定用cls命名)。当你调用B.methodA()时,cls就会被赋值为B类,打印cls自然就能得到你想要的结果。
  • 原来的methodA没有self或cls参数,本质是定义在类中的普通函数,它的__class__在定义阶段就固定绑定到了A类,所以无论哪个子类调用,都会输出A。
  • 如果把A设为抽象类,只需要让它继承ABC(Python 3.4+的标准写法),这完全不会影响类方法的动态绑定行为,还能按需添加抽象方法来约束子类,完美兼容你的需求。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.27 07:11:09