📖 知识点
1. 单下划线 _attr:约定保护属性
只是人为约定,告诉别的开发者:这个属性属于内部使用,外部尽量不要直接访问 / 修改
⚠️ 语法层面没有任何限制,外部依然可以读写
class Student:
def __init__(self, name, score):
self.name = name
self._score = score # 单下划线,约定内部属性
stu = Student("小明",88)
print(stu._score) # 依然可以读取,只是不推荐这么做
2. 双下划线 __attr:名称改写(伪私有)
Python 底层会自动改名:self.__score → _类名__score
外部不能直接通过对象.__score 访问,会报错
目的:防止子类意外重写覆盖这个属性,不是绝对加密,仍然可以绕开访问
class Student:
def __init__(self, name, score):
self.name = name
self.__score = score # 双下划线
stu = Student("小明",88)
# print(stu.__score) # 直接访问会报错 AttributeError
print(stu._Student__score) # 底层改写后的名字,可以读取
💡 总结
name:公开属性,随便读写_name:约定保护,建议外部不要直接碰,语法不限制__name:触发名称改写,阻止意外直接访问,不是绝对保密
行业规范:绝大多数场景优先使用单下划线;双下划线尽量少用,容易踩坑。
⚔️ Kata 实战任务
任务需求:
定义 Student 类
init:name 为公开属性;
_age单下划线;__score双下划线实例化 stu = Student ("小雅",15,95)
打印公开 name;尝试打印
_age;直接尝试访问__score观察报错使用改写后的名称读取
__score
参考代码
class Student:
def __init__(self, name, age, score):
self.name = name # 公开属性
self._age = age # 约定保护
self.__score = score # 双下划线,名称改写
stu = Student("小雅", 15, 95)
print("✅ 公开name:", stu.name)
print("✅ 单下划线_age依然可读:", stu._age)
# print(stu.__score) # 取消注释运行,会直接报错!
# 通过底层改写后的名字访问
print("✅ 双下划线改写后读取score:", stu._Student__score)
运行输出:
✅ 公开name: 小雅
✅ 单下划线_age依然可读: 15
✅ 双下划线改写后读取score: 95
🧠 思考题
Python 的双下划线私有,能不能做到完全加密,外部无法读取?
项目开发,什么时候用单下划线,什么时候尽量避免双下划线?
行者孙Python