python中没有真正私有字段,其“私有”仅通过双下划线开头的名称改写(如__field变为_classname__field)实现,目的是避免子类覆盖和命名冲突,但外部仍可直接访问修改,属约定而非强制控制。

Python 中没有真正私有的字段,所谓“私有”只是通过命名约定和名称改写(name mangling)实现的伪私有机制,不是语言层面的强制访问控制。
私有字段(双下划线 __ 开头)的实现原理
-
Python 解释器会将形如
__field的属性名,在类定义时自动重命名为_ClassName__field
例如:class Account: def __init__(self): self.__balance = 1000实际在内存中存储为
obj._Account__balance,而不是obj.__balance 这个重命名过程叫 名称改写(Name Mangling),只对以双下划线开头、且不以双下划线结尾的名称生效(排除
__init__这类特殊方法)-
名称改写的目的是:
- 防止子类意外覆盖父类的同名私有属性
- 在多重继承场景中避免命名冲突
- 向外部使用者发出明确信号:“这不是公开接口”
为什么不是“真正私有”?
-
外部仍可通过
_ClassName__field直接读写acc = Account() print(acc._Account__balance) # 可以访问,输出 1000 acc._Account__balance = 2000 # 也可以修改
Python 不拦截访问,也不抛出运行时错误——它信任开发者是“负责任的成年人”
单下划线
_field更是纯约定,不触发任何改写,仅靠文档、IDE 提示和团队规范约束使用
正确使用方式
把
__field当作内部实现细节,只在本类方法中直接使用-
对外提供公有方法(getter/setter)来访问或修改,比如:
def get_balance(self): return self.__balance def set_balance(self, value): if value >= 0: self.__balance = value 避免在子类或外部代码中硬编码
_ClassName__field,这属于破坏封装,一旦类名变更就会失效
不复杂但容易忽略











