Python中子类如何继承父类类方法并获取自身类变量?
问题分析与解决方案
问题根源
你在父类Parent的getVar1Var2AsString方法中,直接通过Parent.getVar1()和Parent.getVar2()调用类方法——这会强制绑定到Parent类本身,完全忽略了当前实例所属的子类Child。所以即便创建了Child实例,方法里还是会读取父类的var1和var2,导致输出foo_bar而非预期的banana_apple。
三种可行解决方案
方案1:在实例方法中动态获取当前类
修改父类的getVar1Var2AsString方法,通过self.__class__获取实例所属的类,再调用对应类方法:
class Parent: var1 = 'foo' var2 = 'bar' def getVar1Var2AsString(self): # 用self.__class__替代硬编码的Parent return f'{self.__class__.getVar1()}_{self.__class__.getVar2()}' @classmethod def getVar1(cls): return cls.var1 @classmethod def getVar2(cls): return cls.var2
当创建Child实例时,self.__class__会指向Child类,自然会读取子类重写的var1和var2。
方案2:将getVar1Var2AsString改为类方法
如果这个方法不需要依赖实例属性,直接把它改成类方法,利用cls参数自动绑定当前类:
class Parent: var1 = 'foo' var2 = 'bar' @classmethod def getVar1Var2AsString(cls): return f'{cls.getVar1()}_{cls.getVar2()}' @classmethod def getVar1(cls): return cls.var1 @classmethod def getVar2(cls): return cls.var2
调用时既可以用实例调用child.getVar1Var2AsString(),也可以直接用类调用Child.getVar1Var2AsString(),结果都是banana_apple。
方案3:直接通过实例访问类变量
如果你的类变量不会被实例变量覆盖,最简单的方式是直接在实例方法中通过self访问类变量:
class Parent: var1 = 'foo' var2 = 'bar' def getVar1Var2AsString(self): return f'{self.var1}_{self.var2}' @classmethod def getVar1(cls): return cls.var1 @classmethod def getVar2(cls): return cls.var2
Python中实例访问属性时,会优先查找实例自身的属性,找不到就会去所属类中查找,所以Child实例的self.var1会读取到子类重写的banana。
内容的提问来源于stack exchange,提问作者caio.valente14
相关产品推荐
相关产品推荐

