46
封装
封装(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 分钟)
- 增加
withdraw方法并校验余额。 - 增加
transfer_to。 - 失败时返回友好错误信息。
课堂小测参考答案与判分点
- 参考答案方向:能写出可运行代码,并覆盖题目中的核心条件与边界输入。
- 判分点 1(正确性):主流程结果正确,关键分支可执行。
- 判分点 2(可读性):变量命名清晰,结构不过度嵌套。
- 判分点 3(健壮性):对空值、类型错误或异常输入有基础保护。
迁移任务(课后)
把“订单状态更新”改成封装方法(禁止外部直接改状态字段)。
本节验收标准
你能独立做到:
- 通过方法保护内部状态
- 在状态更新中加入业务校验
- 解释封装如何降低 bug
常见报错与调试步骤(新手版)
- 报错看不懂:先读最后一行错误类型(如
TypeError、NameError),再回到对应代码行定位。 - 不确定变量值:在关键位置临时
print(变量, type(变量)),先确认数据是否符合预期。 - 改了代码却没生效:确认文件已保存、运行的是当前文件、终端环境(venv)是否正确。
常见误区
- 误区:所有字段都必须私有。
- 正解:按风险和边界设计封装级别。