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

Python3中如何声明受保护成员?子类继承访问问题求助

解决Python子类访问父类“受保护”成员的问题

嘿,我来帮你理清这个Python面向对象里的小坑!

首先得明确:Python里没有像Java/C++那样严格的protected(受保护)成员修饰符,而你用的双下划线__x是Python的**名称修饰(name mangling)**机制,它会把变量名偷偷改成_类名__变量名,目的是避免子类意外覆盖父类的私有成员,而不是真的完全禁止访问。

你写的代码之所以报错,是因为父类里的__x被改成了_Parent__x,而子类里的self.__x会被解析成_Child__x,自然找不到父类的那个变量啦。

正确的做法:用单下划线约定“受保护”成员

Python社区的通用做法是用**单个下划线_x**来标记“受保护”成员——这是一种编码规范,虽然Python本身不会强制阻止外部访问,但所有开发者都会明白:这个成员是类内部/子类可以用的,外部不要随便碰。

修改你的代码如下:

class Parent():
    _x = 50  # 单下划线约定为受保护成员

class Child(Parent):
    def __init__(self):
        print(self._x)  # 子类可以直接访问

x = Child()  # 运行后会输出50

(不推荐)绕过名称修饰访问双下划线成员

如果你非要用双下划线的变量,也可以通过名称修饰后的名字来访问,但这其实是绕过了封装机制,不建议这么做——因为如果父类以后修改了变量名,子类的代码也得跟着改,维护性很差:

class Parent():
    __x = 50

class Child(Parent):
    def __init__(self):
        print(self._Parent__x)  # 直接用修饰后的名字访问父类变量

x = Child()  # 也能输出50,但不推荐这么写

总结一下:如果想让子类能访问父类的成员,用单下划线是最符合Python编码习惯的方式,既保证了子类的可访问性,又遵循了封装的设计原则。

内容的提问来源于stack exchange,提问作者Gyan

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.26 10:55:36