继承与多态
继承和多态是面向对象编程(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. 小结
- 继承:
- 子类可复用父类代码。
- 支持重写方法、扩展功能。
- 多态:
- 子类对象可通过父类接口调用,动态决定行为。
通过继承与多态,可以让代码更加模块化、易维护、灵活扩展!