Python 入门教程(7)面向对象 | 7.6、多态
文章目录
- 一、多态
- 1、鸭子类型
- 2、实现多态的机制
- 2.1、鸭子类型
- 2.2、继承与重写
- 3、Python多态的优势
- 4、总结
前言:
在面向对象编程(OOP)中,多态(Polymorphism)是一种非常重要的概念,多态就是同一个一种接口,根据调用对象的不同而表现出不同的行为。Python作为一门动态类型语言,其多态性实现起来非常自然和直观,因为它天生支持动态绑定和鸭子类型(Duck Typing)。
一、多态
1、鸭子类型
鸭子类型是一种动态类型系统,其核心思想是关注对象能够做什么(即它们的方法和行为),而不是它们是什么(即它们的类型或类)。这意味着在Python中,你不需要显式地声明一个对象属于某个特定的类或者实现了某个接口,只要它拥有你需要的方法,你就可以像使用那个类型的对象一样来使用它。
示例:
假设有一个场景,需要处理不同类型的图形对象,并计算它们的面积。可以定义一个
Shape基类(尽管在鸭子类型中这不是必需的),然后创建几个继承自Shape的子类(如Circle和Rectangle),但实际上,并不需要这样做。只需要确保每个对象都有一个area()方法即可。
class Circle: def __init__(self, radius): self.radius = radius def area(self): return 3.14 * self.radius ** 2 class Rectangle: def __init__(self, width, height): self.width = width self.height = height def area(self): return self.width * self.height # 假设我们还有一个非图形对象,但它也有area方法
class AreaCalculator: def __init__(self, base_area): self.base_area = base_area def area(self): return self.base_area * 2 # 假设这是某种特定的计算方式 # 使用鸭子类型
def calculate_area(shape): return shape.area() circle = Circle(5)
rectangle = Rectangle(4, 5)
calculator = AreaCalculator(10) print(calculate_area(circle)) # 调用Circle的area方法
print(calculate_area(rectangle)) # 调用Rectangle的area方法
print(calculate_area(calculator))# 调用AreaCalculator的area方法,尽管它不是图形对象
鸭子类型的优点:
- 灵活性: 鸭子类型使得Python程序更加灵活,因为它允许开发者在不修改现有代码的情况下,轻松地添加新的类型或类。只要新类型遵循了某些协议(即拥有特定的方法或属性),它就可以无缝地集成到现有系统中。
- 简洁性: 由于Python不要求显式地声明类型或接口,代码变得更加简洁。开发者可以专注于实现功能,而不是编写大量的类型声明和接口定义。
- 动态性: Python的动态特性与鸭子类型相辅相成,使得程序能够在运行时根据需要改变其行为。这种能力在编写大型、复杂的系统时尤其有用。
2、实现多态的机制
Python中可以通过多种方式实现多态,下面介绍下常用的方式
2.1、鸭子类型
鸭子类型强调的是对象的行为,而不是它们的类型或类。这意味着,只要对象具有我们期望的方法,就可以以统一的方式调用它们,而无需关心它们具体属于哪个类。
示例:
# 定义一个接口(虽然Python中没有显式的接口定义,但我们可以通过文档或约定来模拟)
# 假设我们有一个可以“执行”的接口,它应该有一个名为execute的方法 class Executable: """ 这是一个模拟的接口,用于说明可执行对象应该具有execute方法。 注意:Python中实际上并不需要显式定义这样的接口类。 """ def execute(self): raise NotImplementedError("子类必须实现这个方法") # 定义两个实现了“execute”方法的类
class Script: def execute(self): print("Running a script...") class Command: def execute(self): print("Executing a command...") # 定义一个函数,它接受任何具有execute方法的对象
def run_anything(executable): executable.execute() # 创建不同类型的对象,它们都实现了execute方法
script = Script()
command = Command() # 使用多态的方式调用它们
run_anything(script) # 输出: Running a script...
run_anything(command) # 输出: Executing a command... # 注意:我们甚至可以传入一个没有继承自Executable,但具有execute方法的对象
class CustomExecutable: def execute(self): print("Executing something custom...") custom = CustomExecutable()
run_anything(custom) # 输出: Executing something custom...
2.2、继承与重写
在Python中,继承和方法重写(或称为方法覆盖)是实现多态性的另一种方式,尽管从技术上讲,多态性主要是通过动态类型系统(即“鸭子类型”)来实现的,但继承和方法重写为多态性提供了额外的结构和灵活性。
示例:
# 定义一个基类(接口)
class Shape: def draw(self): raise NotImplementedError("子类必须实现这个方法") # 定义两个子类,它们继承自Shape类并重写draw方法
class Circle(Shape): def draw(self): print("Drawing a circle...") class Rectangle(Shape): def draw(self): print("Drawing a rectangle...") # 定义一个函数,它接受Shape类型的对象作为参数
def draw_shape(shape): shape.draw() # 创建Circle和Rectangle对象
circle = Circle()
rectangle = Rectangle() # 使用多态的方式调用draw方法
draw_shape(circle) # 输出: Drawing a circle...
draw_shape(rectangle) # 输出: Drawing a rectangle...
3、Python多态的优势
- 灵活性: Python的多态允许开发者编写灵活且可复用的代码,因为你可以轻松地扩展程序以支持新的类型,而无需修改现有的代码。
- 可扩展性: 通过遵循相同的接口(即具有相同的方法签名),新的类可以轻松地集成到现有的程序中,而不需要对现有代码进行大的修改。
- 代码清晰度: 多态使得代码更加清晰易懂,因为它减少了类型检查和条件语句的需要,使得代码更加简洁。
4、总结
Python通过其动态类型和鸭子类型机制,自然地支持多态性。这使得Python在编写可重用、可扩展和灵活的代码时非常强大。在Python中利用多态,可以极大地提高代码的可读性和可维护性,同时也使得程序更加易于扩展和修改。
相关文章:
Python 入门教程(7)面向对象 | 7.6、多态
文章目录 一、多态1、鸭子类型2、实现多态的机制2.1、鸭子类型2.2、继承与重写 3、Python多态的优势4、总结 前言: 在面向对象编程(OOP)中,多态(Polymorphism)是一种非常重要的概念,多态就是同一…...
Cilium + ebpf 系列文章-什么是ebpf?(一)
前言: 这篇非常非常干,很有可能读不懂。 这里非常非常推荐,建议使用Cilium官网的lab来辅助学习!!!Resources Library - IsovalentExplore Isovalents Resource Library, your one-stop destination for ins…...
RabbitMQ08_保证消息可靠性
保证消息可靠性 一、生产者可靠性1、生产者重连机制(防止网络波动)2、生产者确认机制Publisher Return 确认机制Publisher Confirm 确认机制 二、MQ 可靠性1、数据持久化交换机、队列持久化消息持久化 2、Lazy Queue 惰性队列 三、消费者可靠性1、消费者…...
恶意Bot流量识别分析实践
1、摘要 随着互联网的发展,自动化工具和脚本(Bots)的使用越来越普遍。虽然一些善意 Bots 对于网站的正常运行和数据采集至关重要,但恶意 Bots 可能会对网站带来负面影响,如爬取敏感信息、恶意注册、刷流量等。因此&am…...
Java2 实用教程(第6版)习题2 第四题
【源文件的命名与书中的不同】 四、阅读程序题 1、上机运行下列程序,注意观察输出的结果。 public class E2_1 {public static void main(String args[]){for(int i20302;i<20322;i){System.out.println((char) i);}} } 运行结果: 低 住 佐 佑 佒…...
HashMap和ConcurrentHashMap的区别
1.是什么 HashMap和ConcurrentHashMap都是Java集合框架中的成员,它们用于存储键值对,但它们在并发场景下的表现和行为有很大的不同。以下是它们之间的一些主要区别: 1. 并发安全性 HashMap: HashMap不是线程安全的。如果多个线程同时访问Has…...
css 下拉框展示:当hover的时候展示下拉框 z-index的用法解释
代码如下: <template><div class"outer"><div class"left"></div><div class"aTest2"><div class"box">显示方框</div><div class"aTest3"></div></…...
spring装配笔记
spring装配是个大课题,能懂一点是一点吧。 关于代码链路,最后的方式就是倒序摸索,正序那么多逻辑,没有一百万也差不多少,所以就用倒序。 .(点号)和#井号是一个意思,下面代码可能不详细区分,复…...
vscode【实用插件】Notes 便捷做笔记
安装 在 vscode 插件市场的搜索 Notes点 安装 安装成功后,vscode 左侧栏会出现 使用 初次使用 需先选择一个本地目录 重启 vscode 后,得到 切换笔记目录 新建笔记 快捷键为 Alt N 默认会创建 .md 文件 配合插件 Markdown Preview Enhanced 预览 .md…...
中间件:maxwell、canal
文章目录 1、底层原理:基于mysql的bin log日志实现的:把自己伪装成slave2、bin log 日志有三种模式:2.1、statement模式:2.2、row模式:2.3、mixed模式: 3、maxwell只支持 row 模式:4、maxwell介…...
postman控制变量和常用方法
1、添加环境: 2、环境添加变量: 3、配置不同的环境:local、dev、sit、uat、pro 4、 接口调用 5、清除cookie方法: 6、下载文件方法:...
Spring Boot 中整合 Kafka
在 Spring Boot 中整合 Kafka 非常简单,Spring Kafka 提供了丰富的支持,使得我们可以轻松地实现 Kafka 的生产者和消费者。下面是一个简单的 Spring Boot 整合 Kafka 的示例。 1. 添加依赖 首先,在 pom.xml 中添加 Spring Kafka 的依赖&#…...
什么是开放式耳机?具有什么特色?非常值得入手的蓝牙耳机推荐
开放式耳机是当下较为热门的一种耳机类型。它具有以下特点: 设计结构: 呈现开放式的构造,不会完全堵住耳道。如此一来,外界声音能够较容易地被使用者听到,在使用耳机时可以保持对周围环境的察觉。比如在户外…...
编译 FFmpeg 以支持 AV1 编解码器以及其他硬件加速选项(如 NVENC、VAAPI 等)
步骤 1: 安装必要的依赖 sudo apt update sudo apt install -y \autoconf automake build-essential cmake git libass-dev libfreetype6-dev \libsdl2-dev libtool libva-dev libvdpau-dev libxcb1-dev libxcb-shm0-dev \libxcb-xfixes0-dev pkg-config texinfo wget zlib1g-…...
解释一下Java中的多线程。如何创建一个新的线程?
在Java中,多线程是一种机制,允许一个程序同时执行多个任务或处理。每个任务被称为一个线程。 这种并行执行可以极大地提高应用程序的效率和响应速度。 例如,在开发一个桌面应用程序时,你可以使用一个线程来更新用户界面…...
Java语言程序设计基础篇_编程练习题**18.30 (找出单词)
题目:**18.30 (找出单词) 编写一个程序,递归地找出某个目录下的所有文件中某个单词出现的次数。从命令行如下传递参数: java Exercise18_30 dirName word 习题思路 (读取路径方法)和18.28题差不多,把找…...
MyBatis中 #{} 和 ${} 的区别
1. #{id}(参数占位符) 作用: 使用 #{id} 时,MyBatis 会将 id 参数绑定为 JDBC 的参数。这种方式能够有效防止 SQL 注入攻击,因为它会进行参数的预处理,将参数值作为数据类型的绑定,而不是直接插入到 SQL 语…...
Android Perfetto 学习
1、如何抓取性能日志 方式1、通过手机里的System Tracing抓取 1、点击Settings->System->Developer options->System Tracing->Record trace 打开 2、操作完成后,点击Settings->System->Developer options->System Tracing->Record trace…...
ES数据的删除与备份
背景 需要删除索引下满足指定条件的文档数据,并将删除的数据进行备份。 操作步骤 新建索引 该索引结构与映射关系与原索引一致 查看原索引设置 GET /tb/_settings结果: {"tb" : {"settings" : {"index" : {"ro…...
论文解读《Object-Centric Learning with Slot Attention》
系列文章目录 文章目录 系列文章目录论文细节理解 1. 研究背景2. 论文贡献3. 方法框架3.1 Slot Attention模块3.2 无监督对象发现架构 4. 研究思路5. 实验6. 限制 论文细节理解 supervised property prediction tasks是什么? Supervised property prediction tasks…...
零基础部署Fun-ASR语音识别:支持GPU/CPU/MPS,开箱即用无需配置
零基础部署Fun-ASR语音识别:支持GPU/CPU/MPS,开箱即用无需配置 1. 为什么选择Fun-ASR? 语音识别技术已经成为现代办公和内容创作的重要工具,但传统解决方案往往面临三大痛点:部署复杂、准确率不足、依赖云端服务。Fu…...
美胸-年美-造相Z-Turbo在网络安全领域的创新应用:恶意代码可视化分析
美胸-年美-造相Z-Turbo在网络安全领域的创新应用:恶意代码可视化分析 1. 当安全分析遇上图像生成:一个意想不到的跨界组合 最近在调试一个自动化威胁分析流程时,我偶然发现了一个有趣的现象:当把一段混淆后的JavaScript恶意代码…...
Gpmall分布式事务处理:订单创建与库存扣减的最终一致性保障
Gpmall分布式事务处理:订单创建与库存扣减的最终一致性保障 【免费下载链接】gpmall 项目地址: https://gitcode.com/gh_mirrors/gp/gpmall 在电商系统中,订单创建与库存扣减的分布式事务处理是确保数据一致性的核心挑战。Gpmall项目通过创新的P…...
IT运维监控/可观测性
?? 前言:为什么选择 OpenClaw 对接企业微信? 在2026年的企业数字化办公浪潮中,OpenClaw(曾用名 Clawdbot、Moltbot)已成长为国内领先的开源AI自动化代理工具。凭借其“自然语言驱动、插件化拓展、多平台无缝集成”的…...
ReAct Agent:新手程序员必看!收藏这款融合推理与行动的AI智能体框架,轻松入门大模型应用开发
ReAct框架通过结合推理与行动,解决了传统提示工程的局限性,构建出能主动思考、决策并执行复杂任务的智能体。本文详细介绍了ReAct的核心设计思想,包括推理模块的动态思考链和错误回溯机制,以及行动模块的工具集成和环境状态感知。…...
串口转HID实战:CH9329芯片在无外网环境下的应用指南
CH9329芯片串口转HID实战:隔离环境下的设备控制方案 在工业控制、医疗设备和某些特殊应用场景中,经常需要在物理隔离的网络环境下实现设备控制。CH9329芯片作为一款串口转HID(人机接口设备)的专业芯片,为解决这类问题提…...
OpenClaw浏览器自动化:nanobot镜像实现定时抢购与价格监控
OpenClaw浏览器自动化:nanobot镜像实现定时抢购与价格监控 1. 为什么选择OpenClaw实现浏览器自动化 去年双十一期间,我为了抢购某款显卡,连续三天凌晨守着电脑刷新页面,结果还是错过了补货。这种经历让我开始寻找自动化解决方案…...
快速验证控制逻辑:用快马平台十分钟搭建pid算法仿真原型
今天想和大家分享一个快速验证PID控制算法的小技巧。作为一名自动化工程师,经常需要调试各种控制参数,传统方法要搭建物理实验环境或者用MATLAB仿真,都很费时。最近发现用InsCode(快马)平台可以十分钟就做出一个可交互的PID仿真原型ÿ…...
全格式文档智能处理:AnythingLLM的多模态知识管理解决方案
全格式文档智能处理:AnythingLLM的多模态知识管理解决方案 【免费下载链接】anything-llm 这是一个全栈应用程序,可以将任何文档、资源(如网址链接、音频、视频)或内容片段转换为上下文,以便任何大语言模型(…...
嵌入式串口协议中间件:轻量级SerHelp库设计与应用
1. 项目概述nahs-Bricks-Lib-SerHelp是 NAHS(North American Home System)生态中面向嵌入式砖块化(Brick-based)硬件平台的一套轻量级串行通信辅助库。该库不提供底层驱动实现,而是聚焦于串口协议层的工程化封装与通用…...
