当前位置: 首页 > news >正文

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/h

5. 抽象基类 (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()}")

关键要点

  1. 继承:实现代码重用,建立is-a关系

  2. 多态:同一接口,不同实现

  3. 方法重写:子类可以改变或扩展父类行为

  4. super():调用父类方法

  5. 抽象类:定义接口规范,强制子类实现特定方法

多态和继承的结合使用让代码更加灵活、可扩展和易于维护,是面向对象编程的强大特性。

http://www.dtcms.com/a/524940.html

相关文章:

  • 详解c++中的文件流
  • 2017网站建设费用html网页设计毕业设计作品
  • 单页响应式网站模板html5电商网页制作
  • PaddleOCR-VL:紧凑型0.9B参数模型在多语言文档解析领域表现卓越
  • syssetup!Wizard函数分析之comctl32!_CreatePropertySheetPage
  • Python爬虫数据存储:MySQL实战教程
  • 网站源码免费的电影网站页面seo
  • 青岛建设工程信息网站银川360推广 网站建设
  • 阿里云国际站GPU:怎么使用Workbench工具以SSH协议登录Linux实例?
  • Linux中内核基础设置函数do_basic_setup的实现
  • 乳腺癌良性和恶性图像分类数据集
  • C++通用业务标准库中常用接口函数总结
  • 永久免费的移动建站平台网站备案没通过
  • 汕头建网站国家高新技术企业认定有什么好处
  • 【数论】欧拉定理 扩展欧拉定理
  • 正能量网站入口免费安全想学做网站从哪里入手
  • 南宁网站制作最新招聘信息wordpress文章插件
  • 基于python大数据技术的医疗数据分析与研究
  • 1.Go基础知识入门
  • Linux内核InfiniBand连接管理器(CM)深度解析:架构设计与实现原理
  • 网站网站开发者犯法吗网站负责人
  • Arbess从入门到实战(17) - 使用Arbess+GitPuk+SonarQube实现Java项目代码扫描及自动化部署
  • 开发避坑指南(65):JDK21升级遇NoSuchFieldError:Lombok兼容性修复
  • 周口住房和城乡建设网站大龄工找工作哪个网站好
  • 【DecEx-RAG】
  • 数据结构算法题:list
  • ArkTs-Android 与 ArkTS (HarmonyOS) 存储目录全面对比
  • 网站广告费一般多少钱做网站公司名字应该用图片吗
  • 解决 Word四大烦:消标记、去波浪线、关首字母大写、禁中文引号
  • 统信系统下设置RTC时间