首页 新闻 会员 周边 捐助

python中私有不能访问是指什么

0
[已关闭问题] 关闭于 2025-09-07 16:43
Python 的“私有”并不是真正禁止访问,而是靠名字改写(name mangling) 实现的一种伪私有机制。
一句话:底层名字被偷偷改了,导致“按原名字”找不到而已

  1. 改写规则
    在类体里写任何以 双下划线开头、但不以双下划线结尾 的标识符,如 __value
    解释器会立即把它重命名为
    _类名__value
     
    把类名前缀硬塞进去。
    Python
    复制
    class A:
        def __init__(self):
            self.__x = 10   # 实际变成 self._A__x
    
    a = A()
    print(a.__x)      # AttributeError: 找不到这个名字
    print(a._A__x)    # 10  —— 用改写后的名字就能拿到
     
  2. 继承场景
    子类再写 self.__x 会被改写成 _子类名__x,与父类的 _父类名__x 互不影响
    于是**“看不到”并不是因为权限,而是两个属性根本叫不同名字**。
    Python
    复制
    class B(A):
        def foo(self):
            self.__x = 20          # 实际是 self._B__x = 20
            print(self._A__x)      # 10  仍能显式访问父类那份
     
  3. 类外部同样“可访问”
    只要你知道改写后的名字,就能随意读/写/删:
    复制
    a._A__x = 999
    del a._A__x
     
    没有任何权限检查,也不会触发异常。
  4. 什么时候不触发改写
    • 双下划线开头并且双下划线结尾的名字(__init____str__…)属于魔法方法,会被保留原样。
    • 单下划线 _name 只是约定“内部使用”,解释器不动名字,全靠程序员自觉。

一句话总结
Python 的“私有”不是禁止访问,而是把名字偷偷换掉,让你“按原键找不到”;
真要想访问,只要按改写后的名字 _类名__属性 就能随便玩——全靠自觉,不靠强制。
_java_python的主页 _java_python | 小虾三级 | 园豆:984
提问于:2025-09-07 16:43
< >
分享
清除回答草稿
   您需要登录以后才能回答,未注册用户请先注册