2025-10-22
python
00
请注意,本文编写于 47 天前,最后修改于 47 天前,其中某些信息可能已经过时。

目录

Python 继承与多态
1. 继承 (Inheritance)
基本概念
基本语法
2. 继承示例
基础继承
方法重写 (Override)
3. 多态 (Polymorphism)
多态概念
4. 继承的进阶特性
super() 函数
多重继承
5. 类型检查和抽象基类
isinstance() 和 issubclass()
抽象基类 (ABC)
6. 实际应用案例
员工管理系统
7. 鸭子类型 (Duck Typing)
总结
继承的优点:
多态的优点:
使用原则:

Python 继承与多态

1. 继承 (Inheritance)

基本概念

继承允许一个类(子类)继承另一个类(父类)的属性和方法

基本语法

python
class ParentClass: # 父类定义 pass class ChildClass(ParentClass): # 子类定义 pass

2. 继承示例

基础继承

python
class Animal: def __init__(self, name, age): self.name = name self.age = age def eat(self): return f"{self.name}正在吃东西" def sleep(self): return f"{self.name}正在睡觉" class Dog(Animal): # Dog类继承Animal类 def bark(self): return f"{self.name}在汪汪叫" class Cat(Animal): # Cat类继承Animal类 def meow(self): return f"{self.name}在喵喵叫" # 使用示例 dog = Dog("旺财", 3) cat = Cat("咪咪", 2) print(dog.eat()) # 继承自Animal类 print(dog.bark()) # Dog类自己的方法 print(cat.sleep()) # 继承自Animal类 print(cat.meow()) # Cat类自己的方法

方法重写 (Override)

python
class Animal: def __init__(self, name): self.name = name def make_sound(self): return "动物发出声音" class Dog(Animal): def make_sound(self): # 重写父类方法 return "汪汪汪!" class Cat(Animal): def make_sound(self): # 重写父类方法 return "喵喵喵!" # 测试 animals = [Dog("小黑"), Cat("小白")] for animal in animals: print(f"{animal.name}: {animal.make_sound()}")

3. 多态 (Polymorphism)

多态概念

多态是指不同的类对象对同一消息做出不同的响应

python
class Shape: def area(self): pass def perimeter(self): pass class Rectangle(Shape): def __init__(self, width, height): self.width = width self.height = height def area(self): return self.width * self.height def perimeter(self): return 2 * (self.width + self.height) class Circle(Shape): def __init__(self, radius): self.radius = radius def area(self): return 3.14159 * self.radius ** 2 def perimeter(self): return 2 * 3.14159 * self.radius class Triangle(Shape): def __init__(self, a, b, c): self.a = a self.b = b self.c = c def area(self): # 使用海伦公式 s = (self.a + self.b + self.c) / 2 return (s * (s - self.a) * (s - self.b) * (s - self.c)) ** 0.5 def perimeter(self): return self.a + self.b + self.c # 多态演示 def print_shape_info(shape): """这个函数可以处理任何Shape子类的对象""" print(f"面积: {shape.area():.2f}") print(f"周长: {shape.perimeter():.2f}") print("-" * 20) # 创建不同形状的对象 shapes = [ Rectangle(5, 3), Circle(4), Triangle(3, 4, 5) ] for shape in shapes: print_shape_info(shape)

4. 继承的进阶特性

super() 函数

python
class Person: def __init__(self, name, age): self.name = name self.age = age def introduce(self): return f"我叫{self.name},今年{self.age}岁" class Student(Person): def __init__(self, name, age, student_id): super().__init__(name, age) # 调用父类的__init__ self.student_id = student_id def introduce(self): # 扩展父类方法 base_intro = super().introduce() return f"{base_intro},学号是{self.student_id}" class Teacher(Person): def __init__(self, name, age, subject): super().__init__(name, age) self.subject = subject def introduce(self): base_intro = super().introduce() return f"{base_intro},我教{self.subject}" # 使用 student = Student("小明", 18, "2023001") teacher = Teacher("张老师", 35, "数学") print(student.introduce()) print(teacher.introduce())

多重继承

python
class Flyable: def fly(self): return "我能飞" class Swimmable: def swim(self): return "我能游泳" class Duck(Flyable, Swimmable): def __init__(self, name): self.name = name def quack(self): return "嘎嘎嘎" duck = Duck("唐老鸭") print(duck.fly()) # 来自Flyable print(duck.swim()) # 来自Swimmable print(duck.quack()) # 自己的方法

5. 类型检查和抽象基类

isinstance() 和 issubclass()

python
class Animal: pass class Dog(Animal): pass class Cat(Animal): pass # 类型检查 dog = Dog() cat = Cat() print(isinstance(dog, Dog)) # True print(isinstance(dog, Animal)) # True print(isinstance(dog, Cat)) # False print(issubclass(Dog, Animal)) # True print(issubclass(Cat, Animal)) # True print(issubclass(Dog, Cat)) # False

抽象基类 (ABC)

python
from abc import ABC, abstractmethod class Vehicle(ABC): # 抽象基类 @abstractmethod def start_engine(self): pass @abstractmethod def stop_engine(self): pass def honk(self): # 具体方法 return "喇叭响!" class Car(Vehicle): def start_engine(self): return "汽车引擎启动" def stop_engine(self): return "汽车引擎停止" class Motorcycle(Vehicle): def start_engine(self): return "摩托车引擎启动" def stop_engine(self): return "摩托车引擎停止" # 使用 vehicles = [Car(), Motorcycle()] for vehicle in vehicles: print(vehicle.start_engine()) print(vehicle.honk()) print(vehicle.stop_engine()) print("-" * 20)

6. 实际应用案例

员工管理系统

python
class Employee: def __init__(self, name, employee_id, base_salary): self.name = name self.employee_id = employee_id self.base_salary = base_salary def calculate_salary(self): return self.base_salary def get_info(self): return f"员工: {self.name} (ID: {self.employee_id})" class Manager(Employee): def __init__(self, name, employee_id, base_salary, bonus): super().__init__(name, employee_id, base_salary) self.bonus = bonus def calculate_salary(self): return self.base_salary + self.bonus def manage_team(self): return f"{self.name}正在管理团队" class Developer(Employee): def __init__(self, name, employee_id, base_salary, programming_language): super().__init__(name, employee_id, base_salary) self.programming_language = programming_language def calculate_salary(self): # 开发者有10%的技术津贴 return self.base_salary * 1.1 def code(self): return f"{self.name}正在用{self.programming_language}编写代码" class Intern(Employee): def __init__(self, name, employee_id, base_salary, university): super().__init__(name, employee_id, base_salary) self.university = university def calculate_salary(self): # 实习生工资是基本工资的80% return self.base_salary * 0.8 def study(self): return f"{self.name}正在学习,来自{self.university}" # 使用多态处理员工 def process_employees(employees): total_salary = 0 for employee in employees: print(employee.get_info()) print(f"工资: {employee.calculate_salary():.2f}") # 调用特定类型的方法 if isinstance(employee, Manager): print(employee.manage_team()) elif isinstance(employee, Developer): print(employee.code()) elif isinstance(employee, Intern): print(employee.study()) total_salary += employee.calculate_salary() print("-" * 30) print(f"总工资支出: {total_salary:.2f}") # 创建员工列表 employees = [ Manager("张总", "M001", 15000, 5000), Developer("李工", "D001", 12000, "Python"), Developer("王工", "D002", 13000, "Java"), Intern("小明", "I001", 4000, "清华大学") ] process_employees(employees)

7. 鸭子类型 (Duck Typing)

Python的多态更多基于鸭子类型而不是严格的继承关系

python
# 不依赖于继承的多态 class PDFGenerator: def generate(self, data): return f"生成PDF: {data}" class HTMLGenerator: def generate(self, data): return f"生成HTML: {data}" class CSVGenerator: def generate(self, data): return f"生成CSV: {data}" # 使用鸭子类型 - 只要对象有generate方法就可以 def export_data(generator, data): """导出数据,不关心generator的具体类型""" return generator.generate(data) # 测试 generators = [PDFGenerator(), HTMLGenerator(), CSVGenerator()] data = "一些数据" for generator in generators: print(export_data(generator, data))

总结

继承的优点:

  • 代码重用
  • 层次化组织代码
  • 易于维护和扩展

多态的优点:

  • 接口统一
  • 代码灵活性
  • 易于扩展新功能

使用原则:

  1. 使用继承建立"is-a"关系
  2. 优先使用组合而非多重继承
  3. 利用多态编写通用代码
  4. 遵循里氏替换原则:子类应该能够替换父类
如果对你有用的话,可以打赏哦
打赏
ali pay
wechat pay

本文作者:李佳玮

本文链接:

版权声明:本博客所有文章除特别声明外,均采用 BY-NC-SA 许可协议。转载请注明出处!