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
相关产品推荐
相关产品推荐

