Python多态与继承详解
1. 继承 (Inheritance)
继承允许一个类(子类)获取另一个类(父类)的属性和方法。
基本继承示例
class Animal:def __init__(self, name):self.name = namedef speak(self):raise NotImplementedError("子类必须实现此方法")def move(self):print(f"{self.name} 在移动")class Dog(Animal): # Dog继承Animaldef speak(self):return "汪汪!"def fetch(self):return f"{self.name} 在接飞盘"class Cat(Animal): # Cat继承Animaldef speak(self):return "喵喵!"def climb(self):return f"{self.name} 在爬树"# 使用示例
dog = Dog("旺财")
cat = Cat("咪咪")print(dog.speak()) # 输出: 汪汪!
print(cat.speak()) # 输出: 喵喵!
dog.move() # 输出: 旺财 在移动2. 多态 (Polymorphism)
多态指同一个方法在不同类中有不同的实现。
多态示例
def animal_sound(animal):"""这个函数可以接受任何Animal子类的对象"""return animal.speak()# 多态的使用
animals = [Dog("大黄"), Cat("小花"), Dog("小黑")]for animal in animals:print(f"{animal.name}: {animal_sound(animal)}")# 输出:
# 大黄: 汪汪!
# 小花: 喵喵!
# 小黑: 汪汪!3. 继承的类型
3.1 单继承
class Bird(Animal):def __init__(self, name, can_fly=True):super().__init__(name) # 调用父类的构造函数self.can_fly = can_flydef speak(self):return "叽叽!"def move(self):if self.can_fly:return f"{self.name} 在飞翔"else:return f"{self.name} 在走路"# 使用
sparrow = Bird("小麻雀")
penguin = Bird("企鹅", False)print(sparrow.move()) # 输出: 小麻雀 在飞翔
print(penguin.move()) # 输出: 企鹅 在走路3.2 多重继承
class Swimmer:def swim(self):return "在水中游泳"class Flying:def fly(self):return "在空中飞翔"class Duck(Animal, Swimmer, Flying): # 多重继承def speak(self):return "嘎嘎!"def move(self):return f"{self.name} 可以走路、游泳和飞翔"# 使用
duck = Duck("唐老鸭")
print(duck.speak()) # 输出: 嘎嘎!
print(duck.swim()) # 输出: 在水中游泳
print(duck.fly()) # 输出: 在空中飞翔4. 方法重写 (Method Overriding)
class Horse(Animal):def __init__(self, name, speed):super().__init__(name)self.speed = speeddef speak(self): # 重写父类方法return "嘶嘶!"def move(self): # 重写并扩展父类方法base_move = super().move() # 调用父类方法return f"{base_move}, 速度 {self.speed} km/h"# 使用
horse = Horse("闪电", 60)
print(horse.move()) # 输出: 闪电 在移动, 速度 60 km/h5. 抽象基类 (Abstract Base Class)
使用abc模块创建不能被实例化的抽象基类:
from abc import ABC, abstractmethodclass Shape(ABC):@abstractmethoddef area(self):pass@abstractmethoddef perimeter(self):passclass Rectangle(Shape):def __init__(self, width, height):self.width = widthself.height = heightdef area(self):return self.width * self.heightdef perimeter(self):return 2 * (self.width + self.height)class Circle(Shape):def __init__(self, radius):self.radius = radiusdef area(self):return 3.14 * self.radius ** 2def perimeter(self):return 2 * 3.14 * self.radius# 使用
shapes = [Rectangle(4, 5), Circle(3)]for shape in shapes:print(f"面积: {shape.area()}, 周长: {shape.perimeter()}")6. 实际应用示例
class Employee:def __init__(self, name, salary):self.name = nameself.salary = salarydef work(self):return f"{self.name} 在工作"def calculate_bonus(self):return self.salary * 0.1class Manager(Employee):def __init__(self, name, salary, team_size):super().__init__(name, salary)self.team_size = team_sizedef work(self):return f"{self.name} 在管理团队"def calculate_bonus(self):return self.salary * 0.2 + self.team_size * 100class Developer(Employee):def __init__(self, name, salary, programming_language):super().__init__(name, salary)self.programming_language = programming_languagedef work(self):return f"{self.name} 在用{self.programming_language}编程"def calculate_bonus(self):return self.salary * 0.15# 多态的应用
employees = [Manager("张经理", 10000, 5),Developer("李程序员", 8000, "Python"),Developer("王程序员", 7500, "Java")
]for emp in employees:print(f"{emp.name}: {emp.work()}, 奖金: {emp.calculate_bonus()}")关键要点
继承:实现代码重用,建立is-a关系
多态:同一接口,不同实现
方法重写:子类可以改变或扩展父类行为
super():调用父类方法
抽象类:定义接口规范,强制子类实现特定方法
多态和继承的结合使用让代码更加灵活、可扩展和易于维护,是面向对象编程的强大特性。
