Python无严格私有成员,单下划线(_name)表受保护约定,双下划线(__name)触发病名改写(_ClassName__name)防子类覆盖,双下划线前后(__name__)为魔法方法;真封装需@property等机制。
Python 中没有严格意义上的私有成员,但通过命名约定和语言机制实现了封装效果。理解这一点是掌握 Python 面向对象设计的关键。
Python 用下划线前缀表达访问意图,而非强制限制:
__init__、__str__),是 Python 的魔法方法,不参与私有化处理。双下划线触发的改写仅发生在类定义体中,且只对标识符本身生效:
self.__value,Python 会自动转为 self._MyClass__value;__value,会被改写为 _SubClass__value,与父类互不干扰;"__key",不会被改写;只有类体中显式声明的变量/方法名才受影响。
访问”靠下划线无法阻止访问,真正封装需配合其他机制:
立即学习“Python免费学习笔记(深入)”;
@property
def age(self): return self._age
@age.setter
def age(self, v):
if v < 0: raise ValueError("Age can't be negative")
self._age = v
__init__ 或关键方法中做输入检查,把逻辑控制权留在类内;_id: int)明确传达设计意图,辅助团队协作。避免把双下划线当作“安全锁”:
__name 防止用户访问——它只是防手误,不是防恶意;_helper 表达内部用途;obj._ClassName__attr,但应视为临时手段;