如何从子类访问父类的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
相关产品推荐
相关产品推荐

