如何在子类中访问父类属性?解决AttributeError报错问题
如何在Python子类中访问父类的属性?
你的问题出在Python的名称修饰(Name Mangling)机制上:当你在类中定义以双下划线__开头的属性时,Python会自动将其重命名为_类名__属性名,目的是避免子类意外覆盖父类的私有属性。
在你的代码里,父类Queue的__part_list会被Python重命名为_Queue__part_list,而子类SuperQueue中尝试访问self.__part_list时,Python会去寻找_SuperQueue__part_list——这个属性根本不存在,所以抛出AttributeError。
下面是几种可行的解决方案:
方案1:使用单下划线替代双下划线(推荐)
单下划线_开头的属性是Python约定的“受保护属性”,子类可以直接访问,同时也能明确表示这是内部属性,不建议外部直接修改:
class Queue: def __init__(self): self._part_list = [] # 改成单下划线 def put(self, elem): self._part_list.append(elem) print(self._part_list) def get(self): val = self._part_list[0] del self._part_list[0] return val def isempty(self): return len(self._part_list) == 0 # 简化写法 class SuperQueue(Queue): def __init__(self): super().__init__() # 推荐用super()调用父类构造方法,更灵活 def print_list(self): print(self._part_list) # 直接访问受保护属性 que = SuperQueue() que.put(1) que.put("dog") que.put(False) que.print_list() # 输出: [1, 'dog', False]
方案2:在父类中提供访问属性的方法(更符合封装原则)
如果想严格保持父类属性的私有性,可以在父类里添加一个获取属性的方法,子类通过调用该方法来访问:
class Queue: def __init__(self): self.__part_list = [] def put(self, elem): self.__part_list.append(elem) print(self.__part_list) def get(self): val = self.__part_list[0] del self.__part_list[0] return val def isempty(self): return len(self.__part_list) == 0 # 添加获取内部列表的方法 def get_part_list(self): return self.__part_list.copy() # 返回副本避免外部直接修改原列表 class SuperQueue(Queue): def __init__(self): super().__init__() def print_list(self): print(self.get_part_list()) # 调用父类方法获取列表 que = SuperQueue() que.put(1) que.put("dog") que.put(False) que.print_list() # 输出: [1, 'dog', False]
方案3:直接访问名称修饰后的属性(不推荐)
你可以直接使用Python重命名后的属性名_Queue__part_list来访问,但这种方式破坏了封装性,一旦父类的属性名或类名修改,子类代码会失效,所以不建议使用:
class SuperQueue(Queue): def __init__(self): super().__init__() def print_list(self): print(self._Queue__part_list) # 直接访问修饰后的属性
内容的提问来源于stack exchange,提问作者Critney_Spears
相关产品推荐
相关产品推荐

