logo
46

封装

⏱️ 25分钟

封装(Encapsulation):保护状态,避免误操作

你现在可能会困惑什么

“直接改属性更快,为什么还要封装?”

短期快,长期风险高。 封装让所有状态变化都走统一校验规则。

一句话定义

封装是把数据和操作数据的方法放在一起,并限制外部随意改动。

生活类比

银行卡余额不能直接改数据库字段,只能走存款/取款接口。

最小可运行例子

class Wallet:
    def __init__(self, owner, balance=0):
        self.owner = owner
        self.__balance = balance

    def deposit(self, amount):
        if amount > 0:
            self.__balance += amount

    def get_balance(self):
        return self.__balance

课堂小测(5 分钟)

  1. 增加 withdraw 方法并校验余额。
  2. 增加 transfer_to
  3. 失败时返回友好错误信息。

课堂小测参考答案与判分点

  • 参考答案方向:能写出可运行代码,并覆盖题目中的核心条件与边界输入。
  • 判分点 1(正确性):主流程结果正确,关键分支可执行。
  • 判分点 2(可读性):变量命名清晰,结构不过度嵌套。
  • 判分点 3(健壮性):对空值、类型错误或异常输入有基础保护。

迁移任务(课后)

把“订单状态更新”改成封装方法(禁止外部直接改状态字段)。

本节验收标准

你能独立做到:

  • 通过方法保护内部状态
  • 在状态更新中加入业务校验
  • 解释封装如何降低 bug

常见报错与调试步骤(新手版)

  • 报错看不懂:先读最后一行错误类型(如 TypeErrorNameError),再回到对应代码行定位。
  • 不确定变量值:在关键位置临时 print(变量, type(变量)),先确认数据是否符合预期。
  • 改了代码却没生效:确认文件已保存、运行的是当前文件、终端环境(venv)是否正确。

常见误区

  • 误区:所有字段都必须私有。
  • 正解:按风险和边界设计封装级别。