Python 无语法私有变量是刻意设计,强调开发者自律与接口契约;_var为内部提示,__var仅名称改写,真正封装靠property与方法抽象,兼顾动态性与调试需求。

Python 没有语法层面的私有变量,不是设计疏忽,而是有意为之——它把“访问控制”的责任交给了程序员,而非解释器。
信任开发者,而非限制访问
Python 的哲学强调“我们都是 consenting adults”(我们都是有共识的成年人)。语言设计者相信,只要文档清晰、命名明确,开发者会自觉遵守约定,而不是靠编译器或运行时强行阻止。强制私有会增加语法复杂度、降低灵活性,也违背 Python “简洁、直观”的核心原则。
下划线约定是信号,不是锁
单下划线 _var 表示“内部使用,请勿依赖”;双下划线 __var 触发名称改写(name mangling),变成 _ClassName__var,主要防止子类意外覆盖,而非真正隐藏。
-
_var:仅提示作用,导入时
from module import *会忽略它 -
__var:不是加密,只是重命名,仍可直接访问(如
obj._MyClass__var) - 真正的封装靠 property、getter/setter 或方法抽象,而非字段隐藏
动态性与调试友好性优先
Python 是动态语言,运行时检查属性、 monkey patch、调试交互(如 IPython 中 obj.__dict__ 查看所有字段)都依赖属性的可访问性。若强行私有,会破坏这些关键能力。比如单元测试常需临时设置内部状态,或调试时快速探查对象结构——私有字段会成为障碍。
立即学习“Python免费学习笔记(深入)”;
接口比实现更重要
Python 鼓励通过文档字符串、类型提示(typing)、抽象基类(ABC)和明确的公共方法来定义契约。只要 .save() 和 .load() 行为稳定,内部用 _cache 还是 __buffer 都不重要。用户该依赖的是接口,不是字段名。










