【Python语言基础】18、多态

文章目录

    • 1. 多态
      • 1.1 什么是多态
      • 1.2 多态实现方式
      • 1.3 多态的好处
      • 1.4 多态的好处
      • 1.5 不同层面的理解
      • 1.6 多态的优缺点

1. 多态

在 Python 里,多态是一种非常有用的编程特性,它能让你以统一的方式处理不同类型的对象

1.1 什么是多态

多态就好比在生活中,不同职业的人面对 “工作” 这件事,会有不同的表现。

比如老师的工作是教书,医生的工作是治病。虽然大家说的都是 “工作”,但具体的行为却不一样。

在编程中,多态允许你使用相同的代码来处理不同类型的对象,而这些对象会根据自身的类型做出不同的响应。

1.2 多态实现方式

在 Python 里,多态主要通过 继承方法重写 来实现。

下面是一个简单的示例:

# 定义一个父类
class Animal:def speak(self):pass# 定义子类 Dog,继承自 Animal
class Dog(Animal):def speak(self):return "汪汪汪"# 定义子类 Cat,继承自 Animal
class Cat(Animal):def speak(self):return "喵喵喵"# 定义一个函数,用于调用动物的 speak 方法
def animal_speak(animal):print(animal.speak())# 创建 Dog 和 Cat 的实例
dog = Dog()
cat = Cat()# 调用 animal_speak 函数,传入不同的对象
animal_speak(dog)
animal_speak(cat)# 结果
汪汪汪
喵喵喵***Repl Closed***

在这个例子中:

  • Animal 是父类,它定义了一个 speak 方法,但这个方法没有具体的实现。
  • Dog 和 Cat 是 Animal 的子类,它们都重写了 speak 方法,实现了自己独特的叫声。
  • animal_speak 函数接受一个 Animal 类型的对象作为参数,并调用该对象的 speak 方法。
  • 当我们传入 Dog 或 Cat 的实例时,animal_speak 函数会根据对象的实际类型调用相应的 speak 方法,这就是多态的体现。

1.3 多态的好处

  • 代码复用:通过多态,你可以编写通用的代码来处理不同类型的对象,避免了为每种对象类型编写重复的代码。
  • 可扩展性:当需要添加新的对象类型时,只需创建一个新的子类并实现相应的方法,而不需要修改现有的代码。

1.4 多态的好处

Python 是一种动态类型语言,这意味着在运行时才确定变量的类型。这种特性使得多态在 Python 中更加灵活。只要对象具有所需的方法,就可以将其传递给相应的函数,而不需要考虑对象的具体类型。

1.5 不同层面的理解

  • 鸭子类型(Duck Typing)
    在 Python 中,多态常常通过鸭子类型来体现。
    鸭子类型的核心思想是:“如果它走路像鸭子,叫声像鸭子,那么它就是鸭子”。也就是说,在代码中不关注对象的具体类型,只关注对象是否具有特定的方法和属性。
class Bird:def fly(self):print("鸟在飞")class Airplane:def fly(self):print("飞机在飞")def make_fly(obj):obj.fly()bird = Bird()
airplane = Airplane()make_fly(bird)
make_fly(airplane)

在这个例子中,make_fly 函数不关心传入的对象是 Bird 类还是 Airplane 类的实例,只要对象有 fly 方法,就可以调用该方法,这就是鸭子类型实现的多态。

  • 多态与其他特性的关联

多态与继承:
继承是实现多态的重要手段之一。通过继承,子类可以重写父类的方法,从而在调用相同方法时表现出不同的行为。前面已经有很多通过继承实现多态的例子,比如动物叫声、图形绘制等。

多态与封装:
封装是将数据和操作数据的方法捆绑在一起,隐藏对象的内部实现细节。多态可以基于封装来实现,不同的类通过封装各自的方法,在外部调用时以统一的方式呈现不同的行为。例如在游戏开发中,每个角色类封装了自己的攻击方法,外部通过统一的接口调用攻击方法,体现了多态。

1.6 多态的优缺点

  1. 优点
  • 代码复用和可维护性:可以编写通用的代码来处理不同类型的对象,减少代码重复,提高代码的可维护性。当需要添加新的对象类型时,只需要实现相应的方法,而不需要修改现有的代码。

  • 扩展性:易于扩展系统功能。例如在图形绘制系统中,添加新的图形类型时,只需要创建新的子类并实现绘制方法,就可以无缝集成到现有的系统中。

  1. 缺点
  • 理解难度:对于初学者来说,多态尤其是涉及到复杂的继承和多继承时,可能会增加理解的难度。需要对类的层次结构和方法调用顺序有清晰的认识。

  • 性能开销:在某些情况下,多态可能会带来一定的性能开销,特别是在使用抽象基类和复杂的方法查找时。不过在大多数实际应用中,这种开销通常是可以接受的。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/diannao/77558.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

AI多模态论文解读:OmniCaptioner:多领域视觉描述生成框架(附脑图)

AIGCmagic社区知识星球是国内首个以AIGC全栈技术与商业变现为主线的学习交流平台,涉及AI绘画、AI视频、大模型、AI多模态、数字人以及全行业AIGC赋能等100应用方向。星球内部包含海量学习资源、专业问答、前沿资讯、内推招聘、AI课程、AIGC模型、AIGC数据集和源码等…

Spring IoC深度解析:掌控Bean存储艺术与分层架构的智慧​​

一、IoC的本质:从"造物主"到"使用者"的思维跃迁 在传统编程中,开发者像"造物主"一样亲手创建每个对象(new UserController()),并管理它们的依赖关系。这种方式导致代码高度耦合&#xf…

ubuntu22.04下安装mysql以及mysql-workbench

一、mysql安装以及配置 安装之前先查看是否已将安装mysql: rpm -qa | grep mysql (一)、在线安装 保证网络正常的情况下: 1、更新软件包: sudo apt update 2、安装mysql安装包 查看可以安装的安装包: sudo apt search mysql-server 安装指定安装包: sudo apt i…

第二届数字图像处理与计算机应用国际学术会议(DIPCA 2025)

重要信息 时间:2025年4月25-27日 地点:中国-西安 官网:www.icipca.net(了解详情) 部分展示 征稿主题 包括但不限于: 图像处理:模式识别、计算机视觉、低级视觉和图像处理、光学技术在图像中的…

【后端开发】Spring MVC阶段总结

文章目录 快捷引入依赖lombok的使用Lombok依赖Lombok使用Lombok注解 三层架构分层的目的MVC与分层的区别三层架构分层的好处 企业命名规范常见命名命名风格介绍大驼峰风格小驼峰风格包名 常见注解Cookie与Session 快捷引入依赖 这个方法可以快捷引入依赖,但是引入依…

FastAPI依赖注入系统及调试技巧

title: FastAPI依赖注入系统及调试技巧 date: 2025/04/11 15:00:50 updated: 2025/04/11 15:00:50 author: cmdragon excerpt: FastAPI的依赖注入系统采用树状结构管理依赖关系,自动解析并执行依赖项。复杂依赖关系可能导致循环依赖、性能问题、逻辑错误和调试困难。使用Fa…

DeepSeek赋能!企业私有化知识库3大搭建方案拆解

最近公司要搭建一个私有化的知识库,通过对比分析,发现企业级私有化知识库搭建有多种方案选型,今天就分享下这几种企业私有化知识库搭建方案。 一、为何选择本地部署? 这个分个人还是企业,如果个人用,其实各…

对称加密与非对称加密与消息摘要算法保证https的数据交互的完整性和保密性

一、对称加密与非对称加密的作用 1. 对称加密 作用: 保密性:对称加密使用相同的密钥对数据进行加密和解密,确保数据在传输过程中不被窃听。效率:对称加密算法(如AES)计算速度快,适合加密大量数…

程序化广告行业(76/89):行业融资全景剖析与代码应用拓展

程序化广告行业(76/89):行业融资全景剖析与代码应用拓展 大家好!在之前的文章里,咱们一起了解了程序化广告行业的发展趋势以及PC端和移动端投放的差异。今天,咱们接着深入学习,这次聚焦在程序化…

两个树莓派如何通过wifi direct传输视频并显示

这里写自定义目录标题 在两台设备上安装必要软件Wi-Fi Direct接收端IP(自动发现或静态设置)设置摄像头参数显示初始化网络设置 系统架构概述 发送端树莓派:捕获视频(摄像头或视频文件)→ 编码 → 通过Wi-Fi Direct传输…

ubuntu22.04安装ROS2 humble

参考: https://zhuanlan.zhihu.com/p/702727186 前言: 笔记本安装了ubuntu20.04安装ros一直失败,于是将系统升级为ununut22.04,然后安装ros,根据上面的教程,目前看来是有可能成功的。 系统升级为ununut…

Python 类型转换详解

文章目录 Python 类型转换详解基本类型转换函数1. 转换为整数 (int())2. 转换为浮点数 (float())3. 转换为字符串 (str())4. 转换为布尔值 (bool()) 容器类型转换1. 转换为列表 (list())2. 转换为元组 (tuple())3. 转换为集合 (set())4. 转换为字典 (dict()) 特殊类型转换1. AS…

【Python Requests 库详解】

目录 简介一、安装与导入安装导入 二、发送 HTTP 请求1. GET 请求基本请求URL 参数 2. POST 请求表单数据提交JSON 数据提交文件上传 3. 其他方法PUT 请求示例DELETE 请求示例 三、处理响应1. 响应内容解析文本内容处理二进制内容处理JSON 数据处理 2. 响应状态与头信息状态码检…

【Python 开源】你的 Windows 关机助手——PyQt5 版定时关机工具

🖥️ 你的 Windows 关机助手——PyQt5 版定时关机工具 相关资源文件已经打包成EXE文件,可双击直接运行程序,且文章末尾已附上相关源码,以供大家学习交流,博主主页还有更多Python相关程序案例,秉着开源精神的…

【MySQL】002.MySQL数据库基础

文章目录 数据库基础1.1 什么是数据库1.2 基本使用创建数据库创建数据表表中插入数据查询表中的数据 1.3 主流数据库1.4 服务器,数据库,表关系1.5 MySQL架构1.6 SQL分类1.7 存储引擎1.7.1 存储引擎1.7.2 查看存储引擎1.7.3 存储引擎对比 前言&#xff1a…

滑动窗口(3)—无重复字符的最长子串

文章目录 题目解析方法一:滑动窗口解法二(暴⼒求解)(不会超时,可以通过):附Java代码 力扣题目:无重复字符的最长子串 题目解析 方法一:滑动窗口 思路和算法 我们先用一…

C++字符串操作详解

引言 字符串处理是编程中最常见的任务之一,而在C中,我们有多种处理字符串的方式。本文将详细介绍C中的字符串操作,包括C风格字符串和C的string类。无论你是C新手还是想巩固基础的老手,这篇文章都能帮你梳理字符串处理的关键知识点…

Vulhub-DC-4靶场通关攻略

下载地址:https://www.vulnhub.com/entry/dc-4,313/ 扫描IP地址 arp-sacn -l扫描端口,开启了80和22端口 nmap -p- 192.168.112.140访问80端口 扫描目录,并没有发现敏感目录 尝试爆破 爆破成功,用户名admin 密码happy 登录成功 …

OfficePlus去掉PDF文件右键菜单里的PDF转换

今天在吾爱破解论坛看到一个求助帖,说是OfficePlus,安装后,PDF文件的右键菜单里多了PDF转换,想去掉,不知道怎么弄。底下的回复基本都是百度复制或者AI搜索出的答案,大致就是找注册表里CLASSID下的菜单栏相关…

大模型本地部署系列(3) Ollama部署QwQ[阿里云通义千问]

大家好,我是AI研究者, 今天教大家部署 一个阿里云通义千问大模型。 QwQ大模型简介 QwQ是由阿里云通义千问(Qwen)团队推出的开源推理大模型,专注于提升AI在数学、编程和复杂逻辑推理方面的能力。其核心特点包括&#x…