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

如何在子类中访问父类属性?解决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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.06 03:10:16