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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.04 10:09:02