封装是通过设计边界、隐藏实现、暴露接口来提升代码可靠性与可维护性,核心在于明确“谁该知道什么”和“谁该能改什么”,落实为私有约定、属性控制、方法交互、类型提示与契约文档。

类与对象封装不是概念背诵,而是通过设计边界、隐藏实现、暴露接口来让代码更可靠、易维护。核心在于“谁该知道什么”和“谁该能改什么”。
定义类时明确职责和私有边界
一个类只做一件事,属性和方法围绕这个职责组织。把不该被外部直接访问的字段用下划线约定(如 _balance)或双下划线(__balance,触发名称改写)标记为私有。
- 用 @property 控制读取逻辑,比如返回格式化后的金额
- 用 @xxx.setter 校验赋值,比如禁止负数存入账户余额
- 避免直接暴露可变对象(如列表、字典),返回副本或只读视图防止外部意外修改
对象创建后只通过公开方法交互
实例化后,不绕过方法直接操作属性。例如银行账户对象,不写 acc._balance = 1000,而调用 acc.deposit(1000) 或 acc.withdraw(200)。
- 所有状态变更都走方法,便于统一加日志、校验、事件通知
- 方法名要动词开头,语义清晰(add_item 比 set_item 更准确)
- 构造函数(__init__)只做必要初始化,复杂逻辑抽成独立方法
用类型提示+文档字符串强化契约
封装不只是技术限制,更是协作约定。类型提示(def withdraw(self, amount: float) -> bool:)和简洁 docstring 告诉调用方“怎么用、返回什么、可能出什么错”。
- 在方法开头用三引号写明用途、参数含义、返回值、异常条件
- 对关键不变量做断言(如 assert self._balance >= 0),开发阶段快速暴露误用
- 测试时优先覆盖公开接口,不测私有方法——它们是内部实现,可随时重构
小项目练手推荐:带权限的配置管理器
写一个 ConfigManager 类,支持加载 JSON 配置、按 key 读取、仅管理员可修改。用私有字典存配置,用 _is_admin 控制写权限,对外只暴露 get(key) 和 set(key, value)(后者检查权限)。
- 自然体现“数据藏起来、行为管起来”的封装本质
- 能直观看到错误调用(如直接改 _config)被拦截的效果
- 后续可扩展加密存储、变更监听等,都不影响已有接口










