Python 的“私有”并不是真正禁止访问,而是靠名字改写(name mangling) 实现的一种伪私有机制。
一句话:底层名字被偷偷改了,导致“按原名字”找不到而已。
-
改写规则
在类体里写任何以 双下划线开头、但不以双下划线结尾 的标识符,如 __value
解释器会立即把它重命名为
_类名__value
把类名前缀硬塞进去。
class A:
def __init__(self):
self.__x = 10
a = A()
print(a.__x)
print(a._A__x)
-
继承场景
子类再写 self.__x
会被改写成 _子类名__x
,与父类的 _父类名__x
互不影响;
于是**“看不到”并不是因为权限,而是两个属性根本叫不同名字**。
class B(A):
def foo(self):
self.__x = 20
print(self._A__x)
-
类外部同样“可访问”
只要你知道改写后的名字,就能随意读/写/删:
a._A__x = 999
del a._A__x
没有任何权限检查,也不会触发异常。
-
什么时候不触发改写
一句话总结
Python 的“私有”不是禁止访问,而是把名字偷偷换掉,让你“按原键找不到”;
真要想访问,只要按改写后的名字 _类名__属性
就能随便玩——全靠自觉,不靠强制。