如何在子类调用父类类方法时获取子类类名(无需重写)
解决方案:使用类方法实现动态类绑定
这问题我熟!核心是你现在的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
相关产品推荐
相关产品推荐

