Python子类调用父类实例方法,解决super().name报错并输出'class name'
错误原因
- 最终版本的代码移除了
MyClassA的顶层类属性name,super()在MyClassA的实例方法中调用时,会向上查找MyClassA的父类(默认是object基类)的name属性,object类无该属性,因此触发AttributeError。 super()的作用是访问当前类的父类成员,你实际需要获取的是子类MyClassB被init类方法设置的类属性name,用super()不符合需求场景。
修复方案
调整print_name方法的属性获取逻辑,直接读取实例对应类的类属性即可,完整可运行代码如下:
class MyClassA: def __init__(self): self.print_name() def print_name(self): # type(self)会指向实例所属的类,这里就是MyClassB name = type(self).name print(name) @classmethod def init(cls): cls.name = 'class name' class MyClassB(MyClassA): pass MyClassB.init() c1 = MyClassB()
运行上述代码将直接输出预期结果 class name。
扩展说明
如果需要适配其他场景,可以按需求调整属性获取逻辑:
- 若要优先取实例属性,不存在再取类属性:直接写
name = self.name即可 - 若要固定取父类
MyClassA的类属性:可给MyClassA补充类属性name = '默认值',然后写name = MyClassA.name
内容的提问来源于stack exchange,提问作者jaried
相关产品推荐
相关产品推荐

