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

如何从子类访问父类的show方法?及相关AttributeError报错排查

如何从子类中访问父类的show方法?

你遇到的这个AttributeError其实是Python里私有属性和构造函数继承的典型坑,咱们来拆解一下问题根源:

问题出在哪?

你的子类Child重写了__init__方法,但完全没执行父类Parent的构造逻辑。父类的__num是双下划线开头的私有属性,Python会自动对它做「名称修饰」——把__num改成_Parent__num的形式,只有父类自己能直接用这个名字访问。

当你创建Child实例时,因为子类的__init__没调用父类的__init__,父类里初始化self.__num的代码根本没执行,所以这个_Parent__num属性根本没出现在Child实例里。这时候你通过super().show()调用父类的方法,它自然找不到这个属性,直接报错。

怎么解决?

有两种简单的修复方式:

方式一:在子类构造函数里调用父类的构造函数

显式调用父类的__init__,让父类的属性初始化逻辑执行:

class Parent: 
    def __init__(self): 
        self.__num = 100 
    def show(self): 
        print("Parent:",self.__num) 
class Child(Parent): 
    def __init__(self):
        # 先调用父类构造,初始化父类的私有属性
        super().__init__()
        self.__var = 10 
    def show(self): 
        super().show() 
        print("Child:",self.__var) 
obj1 = Child() 
obj1.show()

运行这段代码就能正常输出:

Parent: 100
Child: 10

方式二:去掉子类的__init__(如果不需要自定义构造逻辑)

如果你的子类不需要初始化自己的专属属性,或者可以完全继承父类的构造逻辑,直接删掉子类的__init__就行——Python会自动调用父类的构造函数,帮你初始化__num:

class Parent: 
    def __init__(self): 
        self.__num = 100 
    def show(self): 
        print("Parent:",self.__num) 
class Child(Parent): 
    # 删掉子类的__init__,自动继承父类构造
    def show(self): 
        super().show() 
        # 若要添加子类专属属性,仍需重写__init__并调用父类构造
        print("Child:", self._Child__var)
obj1 = Child() 
obj1.show()

额外小提示

如果只是想让子类能访问父类的属性,不一定非要用双下划线私有属性。用单下划线开头的属性(比如_num)是Python社区约定的「受保护属性」,子类可以直接访问,同时也能提醒其他开发者:这个属性是内部用的,不要随便修改。

内容的提问来源于stack exchange,提问作者Mr.A I

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.14 08:08:11