继承与多态

继承和多态是面向对象编程(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. 小结

  • 继承
    • 子类可复用父类代码。
    • 支持重写方法、扩展功能。
  • 多态
    • 子类对象可通过父类接口调用,动态决定行为。

通过继承与多态,可以让代码更加模块化、易维护、灵活扩展!