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

Python 入门教程(7)面向对象 | 7.6、多态

文章目录

  • 一、多态
    • 1、鸭子类型
    • 2、实现多态的机制
      • 2.1、鸭子类型
      • 2.2、继承与重写
    • 3、Python多态的优势
    • 4、总结

前言:

在面向对象编程(OOP)中,多态(Polymorphism)是一种非常重要的概念,多态就是同一个一种接口,根据调用对象的不同而表现出不同的行为。Python作为一门动态类型语言,其多态性实现起来非常自然和直观,因为它天生支持动态绑定和鸭子类型(Duck Typing)。

一、多态

1、鸭子类型

鸭子类型是一种动态类型系统,其核心思想是关注对象能够做什么(即它们的方法和行为),而不是它们是什么(即它们的类型或类)。这意味着在Python中,你不需要显式地声明一个对象属于某个特定的类或者实现了某个接口,只要它拥有你需要的方法,你就可以像使用那个类型的对象一样来使用它。

示例:

假设有一个场景,需要处理不同类型的图形对象,并计算它们的面积。可以定义一个Shape基类(尽管在鸭子类型中这不是必需的),然后创建几个继承自Shape的子类(如CircleRectangle),但实际上,并不需要这样做。只需要确保每个对象都有一个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、上机运行下列程序&#xff0c;注意观察输出的结果。 public class E2_1 {public static void main(String args[]){for(int i20302;i<20322;i){System.out.println((char) i);}} } 运行结果&#xff1a; 低 住 佐 佑 佒…...

HashMap和ConcurrentHashMap的区别

1.是什么 HashMap和ConcurrentHashMap都是Java集合框架中的成员&#xff0c;它们用于存储键值对&#xff0c;但它们在并发场景下的表现和行为有很大的不同。以下是它们之间的一些主要区别&#xff1a; 1. 并发安全性 HashMap: HashMap不是线程安全的。如果多个线程同时访问Has…...

css 下拉框展示:当hover的时候展示下拉框 z-index的用法解释

代码如下&#xff1a; <template><div class"outer"><div class"left"></div><div class"aTest2"><div class"box">显示方框</div><div class"aTest3"></div></…...

spring装配笔记

spring装配是个大课题&#xff0c;能懂一点是一点吧。 关于代码链路&#xff0c;最后的方式就是倒序摸索&#xff0c;正序那么多逻辑&#xff0c;没有一百万也差不多少&#xff0c;所以就用倒序。 .(点号)和#井号是一个意思&#xff0c;下面代码可能不详细区分&#xff0c;复…...

vscode【实用插件】Notes 便捷做笔记

安装 在 vscode 插件市场的搜索 Notes点 安装 安装成功后&#xff0c;vscode 左侧栏会出现 使用 初次使用 需先选择一个本地目录 重启 vscode 后&#xff0c;得到 切换笔记目录 新建笔记 快捷键为 Alt N 默认会创建 .md 文件 配合插件 Markdown Preview Enhanced 预览 .md…...

中间件:maxwell、canal

文章目录 1、底层原理&#xff1a;基于mysql的bin log日志实现的&#xff1a;把自己伪装成slave2、bin log 日志有三种模式&#xff1a;2.1、statement模式&#xff1a;2.2、row模式&#xff1a;2.3、mixed模式&#xff1a; 3、maxwell只支持 row 模式&#xff1a;4、maxwell介…...

postman控制变量和常用方法

1、添加环境&#xff1a; 2、环境添加变量&#xff1a; 3、配置不同的环境&#xff1a;local、dev、sit、uat、pro 4、 接口调用 5、清除cookie方法&#xff1a; 6、下载文件方法&#xff1a;...

Spring Boot 中整合 Kafka

在 Spring Boot 中整合 Kafka 非常简单&#xff0c;Spring Kafka 提供了丰富的支持&#xff0c;使得我们可以轻松地实现 Kafka 的生产者和消费者。下面是一个简单的 Spring Boot 整合 Kafka 的示例。 1. 添加依赖 首先&#xff0c;在 pom.xml 中添加 Spring Kafka 的依赖&#…...

什么是开放式耳机?具有什么特色?非常值得入手的蓝牙耳机推荐

开放式耳机是当下较为热门的一种耳机类型。它具有以下特点&#xff1a; 设计结构&#xff1a; 呈现开放式的构造&#xff0c;不会完全堵住耳道。如此一来&#xff0c;外界声音能够较容易地被使用者听到&#xff0c;在使用耳机时可以保持对周围环境的察觉。比如在户外&#xf…...

编译 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中&#xff0c;多线程是一种机制&#xff0c;允许一个程序同时执行多个任务或处理。每个任务被称为一个线程。 这种并行执行可以极大地提高应用程序的效率和响应速度。 例如&#xff0c;在开发一个桌面应用程序时&#xff0c;你可以使用一个线程来更新用户界面&#xf…...

Java语言程序设计基础篇_编程练习题**18.30 (找出单词)

题目&#xff1a;**18.30 (找出单词) 编写一个程序&#xff0c;递归地找出某个目录下的所有文件中某个单词出现的次数。从命令行如下传递参数&#xff1a; java Exercise18_30 dirName word 习题思路 &#xff08;读取路径方法&#xff09;和18.28题差不多&#xff0c;把找…...

MyBatis中 #{} 和 ${} 的区别

1. #{id}&#xff08;参数占位符&#xff09; 作用: 使用 #{id} 时&#xff0c;MyBatis 会将 id 参数绑定为 JDBC 的参数。这种方式能够有效防止 SQL 注入攻击&#xff0c;因为它会进行参数的预处理&#xff0c;将参数值作为数据类型的绑定&#xff0c;而不是直接插入到 SQL 语…...

Android Perfetto 学习

1、如何抓取性能日志 方式1、通过手机里的System Tracing抓取 1、点击Settings->System->Developer options->System Tracing->Record trace 打开 2、操作完成后&#xff0c;点击Settings->System->Developer options->System Tracing->Record trace…...

ES数据的删除与备份

背景 需要删除索引下满足指定条件的文档数据&#xff0c;并将删除的数据进行备份。 操作步骤 新建索引 该索引结构与映射关系与原索引一致 查看原索引设置 GET /tb/_settings结果&#xff1a; {"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是什么&#xff1f; Supervised property prediction tasks…...

YOLOv8+注意力机制+PyQt5玉米病害检测系统完整资源集合

资源包含可视化的玉米病害检测系统&#xff0c;基于最新的YOLOv8注意力机制训练的玉米病害检测模型&#xff0c;和基于PyQt5制作的可视玉米病害系统&#xff0c;包含登陆页面和检测页面&#xff0c;该系统可自动检测和识别图片或视频当中出现的七类玉米病害&#xff1a;矮花叶病…...

tcp、udp通信调试工具Socket Tool

tcp、udp通信调试工具Socket Tool ]...

MedPrompt:基于提示工程的医学诊断准确率优化方法

Medprompt&#xff1a;基于提示工程的医学诊断准确率优化方法 秒懂大纲解法拆解MedPrompt 提示词全流程分析总结创意视角 论文&#xff1a;Can Generalist Foundation Models Outcompete Special-Purpose Tuning? Case Study in Medicine 秒懂大纲 ├── 1 研究背景【描述背…...

关于ollama 在mac的部署问题

安装 官网链接 直接按需求下载即可 默认模型下载地址 macOS: ~/.ollama/models Linux: /usr/share/ollama/.ollama/models Windows: C:\Users<username>.ollama\models 根据需要的平台设置相应的环境变量&#xff1a; OLLAMA_MODELS 如Mac 设置 &#xff5e;/.zshrc …...

职业技能大赛-单元测试笔记(assertThat)分享

前言 assertThat 是一种用于编写测试断言的方法,广泛应用于 Java 及其他编程语言的测试框架中,如 JUnit 和 AssertJ。它特别强调可读性和流畅性,使得测试代码更加直观易懂,从而提高了开发者在编写和维护测试时的效率。传统的断言方法通常以较为简洁但不够清晰的形式出现,例…...

AI大模型:OpenAI o1或能成为引领AI Phenomenal Ride的LLM新范式

OpenAI 发布 o1 系列大模型&#xff0c;AI 大模型进入新纪元**。**9 月 12 日&#xff0c;OpenAI 宣布开发了一系列全新AI 模型&#xff0c;其被命名为 OpenAI o1-preview&#xff0c;旨在在回应前投入更多时间思考。与之前的模型相比&#xff0c;这些模型能够更好地进行推理&a…...

天命人,如何轻松利用仿真技术打造出属于你的“金箍棒”?

近期&#xff0c;一款以西游记为背景的国产游戏&#xff0c;‌重塑了悟空这一经典角色&#xff0c;‌将其置于一个黑暗、‌魔幻的世界中。同时也是国内第一款 3A 游戏大作&#xff0c;而所谓 3A 游戏&#xff0c;简单来说就是高质量&#xff0c;高体量&#xff0c;高成本的单机…...

【Qt | QAction】Qt 的 QAction 类介绍

&#x1f601;博客主页&#x1f601;&#xff1a;&#x1f680;https://blog.csdn.net/wkd_007&#x1f680; &#x1f911;博客内容&#x1f911;&#xff1a;&#x1f36d;嵌入式开发、Linux、C语言、C、数据结构、音视频&#x1f36d; &#x1f923;本文内容&#x1f923;&a…...

写论文一定要知道的三大AI工具!5分钟完成论文初稿

在当今的学术研究和写作领域&#xff0c;AI工具已经成为不可或缺的助手。它们不仅能够提高写作效率&#xff0c;还能帮助研究者生成高质量的论文。以下是三大值得推荐的AI工具&#xff0c;它们可以帮助你在5分钟内完成论文初稿&#xff0c;并且特别推荐千笔-AIPasspaper。 千笔…...

时装购物|时装购物系统|基于springboot的时装购物系统设计与实现(源码+数据库+文档)

时装购物系统目录 目录 基于springboot的时装购物系统设计与实现 一、前言 二、系统功能设计 三、系统实现 5.1管理员功能模块 四、数据库设计 1、实体ER图 2、具体的表设计如下所示&#xff1a; 五、核心代码 六、论文参考 七、最新计算机毕设选题推荐 八、源码获取…...