铸器篇-Day75 私有属性(单下划线、双下划线)入门

0 次阅读 2026-10-20 09:18

📖 知识点

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) # 底层改写后的名字,可以读取

 

💡 总结

  1. name:公开属性,随便读写

  2. _name:约定保护,建议外部不要直接碰,语法不限制

  3. __name:触发名称改写,阻止意外直接访问,不是绝对保密

行业规范:绝大多数场景优先使用单下划线;双下划线尽量少用,容易踩坑。

⚔️ Kata 实战任务

任务需求:

  1. 定义 Student 类

  2. init:name 为公开属性;_age单下划线;__score双下划线

  3. 实例化 stu = Student ("小雅",15,95)

  4. 打印公开 name;尝试打印_age;直接尝试访问__score观察报错

  5. 使用改写后的名称读取__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

 

🧠 思考题

  1. Python 的双下划线私有,能不能做到完全加密,外部无法读取?

  2. 项目开发,什么时候用单下划线,什么时候尽量避免双下划线?