Python 没有严格的 private/protected 关键字,靠命名约定 和名称改写实现封装。
一、Python 类里有三种"权限"成员
公开、保护、私有,全都有,只是写法和 Java/C++ 不一样。
1. 公开成员(最常用)
不加任何下划线,外部、子类都能随便访问。
2. 保护成员(命名约定)
单下划线 _
-
只是约定:这是内部用的,外部别乱碰
-
可以被访问,Python 不会阻止你,但懂 Python 的人都遵守这个约定
class A:
def init(self):
self._age = 20 # 保护属性
3. 私有成员(自动名称改写)
双下划线 __
- Python 会自动改名,外部不能直接访问,子类也不能直接访问
【什么是自动改名(Name Mangling)
当你在类里写:
class Person:
def init(self):
self.__name = "小明" # 双下划线开头
Python 不会真的存成 __name ,它会自动改成: _类名__属性名
也就是: __name自动变成 _Person__name 这就叫 自动改名。
所以你外部访问 __name 会报错
p = Person()print(p.__name) # ❌ 报错!不存在这个名字 因为 Python 已经把它改名了,你还在用旧名字,当然找不到。
但你用它改后的名字,就能访问
print(p._Person__name) # ✅ 小明
这就是为什么说:Python 没有真正的私有,只是改名防误触,不是防黑客。
】
- 作用:防止意外覆盖/修改
class A:
def init(self):
self.__secret = "私有" # 私有属性
二、总结
-
name → 公开(谁都能访问)
-
_name → 保护(约定内部用)
-
__name → 私有(改名防误触)
Python 类里三种成员都有,不是只有私有!
三、注意
-
日常写代码:公开 + 单下划线 + property 最常用- 双下划线私有很少用,除非你真的要防覆盖
-
Python 没有强制权限,靠约定 + 自觉