第 35 课 · 阶段六 · 面向对象
继承与多态
继承让新类复用旧类的代码,多态让同一方法在不同类中有不同表现。这一课把面向对象的两大支柱讲透。
🎯 学完本课你将掌握
- 掌握继承的语法与作用
- 使用方法重写与 super()
- 理解多态的含义
一、为什么需要继承
多个类有公共的属性与方法时,抽出一个父类(基类),让子类(派生类)继承,避免重复代码。
二、继承基本语法
继承基础.py
1class Animal:2 def __init__(self, name):3 self.name = name45 def speak(self):6 print(f"{self.name} 发出声音")78class Dog(Animal): # 继承 Animal9 pass # 暂时什么都不加1011d = Dog("旺财")12d.speak() # 旺财 发出声音(直接用父类的方法)三、方法重写
子类定义同名方法,就会覆盖父类的实现,这叫重写(override)。
方法重写.py
1class Dog(Animal):2 def speak(self):3 print(f"{self.name}:汪汪!")45class Cat(Animal):6 def speak(self):7 print(f"{self.name}:喵喵~")89for 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 = name45class Dog(Animal):6 def __init__(self, name, breed):7 super().__init__(name) # 调用父类构造,初始化 name8 self.breed = breed # 子类新增属性910d = Dog("旺财", "金毛")11print(d.name, d.breed) # 旺财 金毛六、多重继承
多重继承.py
1class Flyable:2 def fly(self):3 print("我会飞")45class Swimmable:6 def swim(self):7 print("我会游泳")89class Duck(Flyable, Swimmable): # 继承多个10 pass1112d = Duck()13d.fly() # 我会飞14d.swim() # 我会游泳⚠️ 注意
多重继承很强大但容易混乱(菱形继承问题),新手慎用;优先组合(把别的类作为自己的属性)。
七、实战:图形面积计算
图形面积.py
1class Shape:2 def area(self):3 return 045class Rectangle(Shape):6 def __init__(self, w, h):7 self.w, self.h = w, h8 def area(self):9 return self.w * self.h1011class Circle(Shape):12 def __init__(self, r):13 self.r = r14 def area(self):15 return 3.14159 * self.r ** 21617shapes = [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() 调用父类方法,多态让统一接口适配不同实现。面向对象三课连起来,你已经能设计有层次的程序了。