第 35 课 · 阶段六 · 面向对象

继承与多态

继承让新类复用旧类的代码,多态让同一方法在不同类中有不同表现。这一课把面向对象的两大支柱讲透。

第 35 课阶段六 · 面向对象难度:进阶建议时长:40 分钟关键词:继承 · 多态 · 方法重写 · super

🎯 学完本课你将掌握

  • 掌握继承的语法与作用
  • 使用方法重写与 super()
  • 理解多态的含义

一、为什么需要继承

多个类有公共的属性与方法时,抽出一个父类(基类),让子类(派生类)继承,避免重复代码。

二、继承基本语法

继承基础.py
1class Animal:
2 def __init__(self, name):
3 self.name = name
4
5 def speak(self):
6 print(f"{self.name} 发出声音")
7
8class Dog(Animal): # 继承 Animal
9 pass # 暂时什么都不加
10
11d = Dog("旺财")
12d.speak() # 旺财 发出声音(直接用父类的方法)

三、方法重写

子类定义同名方法,就会覆盖父类的实现,这叫重写(override)。

方法重写.py
1class Dog(Animal):
2 def speak(self):
3 print(f"{self.name}:汪汪!")
4
5class Cat(Animal):
6 def speak(self):
7 print(f"{self.name}:喵喵~")
8
9for a in [Dog("旺财"), Cat("咪咪")]:
10 a.speak()

四、多态:同一接口,不同表现

上面的 for 循环里,Dog 和 Cat 都是 Animal,调用同一个 speak() 却输出不同内容——这就是多态:代码面向父类写,运行时各显神通。

五、super():调用父类方法

super 用法.py
1class Animal:
2 def __init__(self, name):
3 self.name = name
4
5class Dog(Animal):
6 def __init__(self, name, breed):
7 super().__init__(name) # 调用父类构造,初始化 name
8 self.breed = breed # 子类新增属性
9
10d = Dog("旺财", "金毛")
11print(d.name, d.breed) # 旺财 金毛

六、多重继承

多重继承.py
1class Flyable:
2 def fly(self):
3 print("我会飞")
4
5class Swimmable:
6 def swim(self):
7 print("我会游泳")
8
9class Duck(Flyable, Swimmable): # 继承多个
10 pass
11
12d = Duck()
13d.fly() # 我会飞
14d.swim() # 我会游泳
⚠️ 注意
多重继承很强大但容易混乱(菱形继承问题),新手慎用;优先组合(把别的类作为自己的属性)。

七、实战:图形面积计算

图形面积.py
1class Shape:
2 def area(self):
3 return 0
4
5class Rectangle(Shape):
6 def __init__(self, w, h):
7 self.w, self.h = w, h
8 def area(self):
9 return self.w * self.h
10
11class Circle(Shape):
12 def __init__(self, r):
13 self.r = r
14 def area(self):
15 return 3.14159 * self.r ** 2
16
17shapes = [Rectangle(3, 4), Circle(2)]
18for s in shapes:
19 print(f"面积:{s.area():.2f}")

八、常见错误与解决

常见错误与解决

错误现象原因 / 解决方法
忘了 super().__init__ 导致父类属性缺失子类自定义 __init__ 后,父类属性不会自动初始化,记得 super().__init__(...)。
重写后想用父类方法却找不到用 super().方法名(...) 显式调用父类实现。
isinstance 判断异常子类实例 is 父类实例类型为 True;判断用 isinstance(obj, ParentClass)。
✍️ 小练习
定义 Person 父类(name、introduce 方法),Student 和 Teacher 继承并重写 introduce;用多态方式统一调用。
📌 本节小结
继承复用父类代码,重写覆盖父类行为,super() 调用父类方法,多态让统一接口适配不同实现。面向对象三课连起来,你已经能设计有层次的程序了。