Python父类静态/类方法中如何获取实际调用的子类类型
问题原因
__class__ 是Python在函数定义阶段就静态绑定的隐式变量,永远指向定义该方法的类,不会随继承关系、调用方的变化动态改变。把get_class抽到基类后,方法定义在BaseClass内部,所以无论哪个子类调用,返回的永远是BaseClass。
修改方案
将公共方法标记为类方法,使用类方法自动注入的cls参数返回当前调用类即可,既消除了重复代码,调用方式也和原代码完全一致:
class BaseClass(): @classmethod def get_class(cls): return cls class Dog(BaseClass): pass class Cat(BaseClass): pass print(Dog.get_class()) print(Cat.get_class())
运行输出和预期完全一致:
<class '__main__.Dog'> <class '__main__.Cat'>
补充说明:类方法的
cls参数是动态绑定的,哪个类发起调用,cls就指向哪个类,不受方法定义位置的影响,完全适配继承场景下的复用需求。
内容的提问来源于stack exchange,提问作者Bradley Marques
相关产品推荐
相关产品推荐

