logo
45

多态

⏱️ 25分钟

多态(Polymorphism):统一接口,不同实现

你现在可能会困惑什么

“同名方法不同实现有什么意义?”

意义在于调用方只关心“接口一致”,不用关心具体类型分支。

一句话定义

多态是不同对象对同一接口给出各自实现。

生活类比

“支付”这个动作对信用卡、支付宝、现金都成立, 调用方只需调用 pay()

最小可运行例子

class Cat:
    def speak(self):
        return "Meow"

class Dog:
    def speak(self):
        return "Woof"

for animal in [Cat(), Dog()]:
    print(animal.speak())

课堂小测(5 分钟)

  1. pay() 的两个实现类。
  2. 用同一循环调用不同支付对象。
  3. 新增第三种支付方式无需改调用方。

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

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

迁移任务(课后)

实现“导出器”接口:CSVExporterJSONExporterMarkdownExporter

本节验收标准

你能独立做到:

  • 设计统一方法签名
  • 扩展实现而不改调用主流程
  • 解释多态对扩展性的价值

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

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

常见误区

  • 误区:多态一定要复杂继承树。
  • 正解:Python 常用鸭子类型即可实现多态。