继承与多态
继承和多态是面向对象编程(OOP)的两个重要特性,用来提升代码复用性、可扩展性和灵活性。
1. 什么是继承?
继承允许一个类(子类)从另一个类(父类或基类)获取属性和方法。通过继承,子类可以重用父类的代码,同时可以新增或修改功能。
(1) 基本语法
在定义子类时,在类名后面加括号,括号内写父类名。
class Parent:
    # 父类
    pass
class Child(Parent):
    # 子类
    pass
(2) 示例
class Animal:
    def __init__(self, name):
        self.name = name
    def speak(self):
        print(f"{self.name} 正在发出声音。")
# Dog 类继承了 Animal 类
class Dog(Animal):
    def fetch(self):
        print(f"{self.name} 正在玩接飞盘游戏。")
dog = Dog("旺财")
dog.speak()  # 调用父类方法
dog.fetch()  # 调用子类方法
2. 重写方法
子类可以重写(覆盖)父类的方法,从而改变其行为。
示例
class Animal:
    def speak(self):
        print("动物在叫。")
class Dog(Animal):
    def speak(self):
        print("汪汪汪!")
class Cat(Animal):
    def speak(self):
        print("喵喵喵!")
dog = Dog()
cat = Cat()
dog.speak()  # 输出:汪汪汪!
cat.speak()  # 输出:喵喵喵!
3. 多继承
Python 支持一个子类继承多个父类。用逗号分隔父类即可。
示例
class Flyable:
    def fly(self):
        print("会飞!")
class Walkable:
    def walk(self):
        print("会走!")
class Bird(Flyable, Walkable):
    pass
bird = Bird()
bird.fly()   # 输出:会飞!
bird.walk()  # 输出:会走!
注意:多继承可能引发复杂性问题,如“菱形继承”(Diamond Problem)。Python 使用 C3 线性化算法解决此问题。
4. super() 函数
在子类中可以使用 super() 调用父类的方法或构造函数。
示例
class Animal:
    def __init__(self, name):
        self.name = name
    def speak(self):
        print(f"{self.name} 正在发出声音。")
class Dog(Animal):
    def __init__(self, name, breed):
        # 调用父类的构造函数
        super().__init__(name)
        self.breed = breed
    def speak(self):
        super().speak()
        print(f"{self.name} 是一只 {self.breed},汪汪叫!")
dog = Dog("旺财", "金毛")
dog.speak()
# 输出:
# 旺财 正在发出声音。
# 旺财 是一只 金毛,汪汪叫!
5. 什么是多态?
多态是指不同的子类对象可以以相同的方式调用父类的方法,并表现出不同的行为。
- 优点:代码更加灵活,能在运行时动态决定调用哪个子类的方法。
 
示例
class Animal:
    def speak(self):
        raise NotImplementedError("子类必须实现这个方法")
class Dog(Animal):
    def speak(self):
        print("汪汪汪!")
class Cat(Animal):
    def speak(self):
        print("喵喵喵!")
# 多态:调用父类的方法,实际执行子类的方法
def make_noise(animal):
    animal.speak()
dog = Dog()
cat = Cat()
make_noise(dog)  # 输出:汪汪汪!
make_noise(cat)  # 输出:喵喵喵!
在 make_noise 函数中,传入任何 Animal 的子类对象,都可以正常调用 speak 方法。这就是多态的核心。
6. 继承与多态的综合使用
示例
我们创建一个管理不同交通工具的系统,各种交通工具(如汽车、自行车等)都有不同的移动方式,但可以通过统一的接口进行调用。
class Vehicle:
    def move(self):
        raise NotImplementedError("子类必须实现这个方法")
class Car(Vehicle):
    def move(self):
        print("汽车在公路上行驶。")
class Bicycle(Vehicle):
    def move(self):
        print("自行车在自行车道上骑行。")
# 多态函数
def start_journey(vehicle):
    vehicle.move()
# 测试
car = Car()
bike = Bicycle()
start_journey(car)  # 输出:汽车在公路上行驶。
start_journey(bike)  # 输出:自行车在自行车道上骑行。
7. 小结
- 继承:
- 子类可复用父类代码。
 - 支持重写方法、扩展功能。
 
 - 多态:
- 子类对象可通过父类接口调用,动态决定行为。
 
 
通过继承与多态,可以让代码更加模块化、易维护、灵活扩展!
