一、单下划线 _attr(受保护,弱私有)
- 写法:
self._password
- 含义:约定内部使用,外部别碰;语法不拦截,仍可访问。
- 示例:
class User:
def __init__(self):
self._pwd = "123" # 受保护属性
u = User()
print(u._pwd) # 能输出 123(不推荐这样写)
二、双下划线 __attr(私有,名称改写)
- 写法:
self.__password
- 原理:触发 名称改写(name mangling) ,变成
_类名__attr,外部不能直接访问。
- 示例:
class User:
def __init__(self):
self.__pwd = "123" # 私有属性
u = User()
print(u.__pwd) # 报错:AttributeError
print(u._User__pwd) # 可强制访问(不推荐)
三、对比(最常用)
| 写法 |
名称 |
访问限制 |
外部直接访问 |
attr |
公有 |
无 |
✅ |
_attr |
受保护 |
约定不访问 |
✅(不推荐) |
__attr |
私有 |
名称改写 |
❌(需强制) |
四、最佳实践
- 普通内部属性:用 单下划线 _ (PEP8 推荐)。
- 避免子类覆盖:用 双下划线 __ 。
- 控制读写:用
@property 封装,安全又优雅:
class User:
def __init__(self):
self.__pwd = "123"
@property
def pwd(self):
return self.__pwd # 只读
u = User()
print(u.pwd) # 123
u.pwd = "456" # 报错:无法修改