简单分享下python多态

目录:

        一、多态是啥嘞(龙生九子各有不同,这就是多态)

        二、基础的实例

        三、多态的优势与应用场景

        四、深入理解

一、多态是啥嘞(龙生九子各有不同,这就是多态)

多态(Polymorphism),顾名思义,就是多种形态。

在面向对象编程(OOP)中,它指的是允许你使用一个接口来表示不同的类型的能力。简单来说,就是同一种行为可以根据发送消息的对象的不同而采用不同的行为方式。

比如,动物园里有各种动物,它们都有“叫”的能力,但是每种动物叫的方式不同。狗会“汪汪”,猫会“喵喵”。如果我们设计一个“动物”类,并让每种动物都继承这个类,然后定义一个“叫”的方法,就能实现多态。

在Python这样的动态语言中,多态的实现尤为自然和灵活,因为Python是基于“鸭子类型”(Duck Typing)的,关注的是“是不是能做某事”,而不是“是什么”。

二、基础的实例

# 定义一个基础的动物类
class Animal:
    def speak(self):
        pass

# 狗类继承动物类,重写speak方法
class Dog(Animal):
    def speak(self):
        return "汪汪"

# 猫类同样继承动物类,重写speak方法
class Cat(Animal):
    def speak(self):
        return "喵喵"

def animal_sound(animal):
    # 不管传入什么动物,只要它能speak就行
    print(animal.speak())

# 实例化并调用
dog = Dog()
cat = Cat()

animal_sound(dog)  # 输出: 汪汪
animal_sound(cat)  # 输出: 喵喵

在这个例子中,animal_sound函数并不关心是什么类型的动物,什么动物都有叫的能力,只要它有一个speak方法就可以。这就是多态的魅力,每个动物都能发出他们不同的叫的动作——通过统一的接口来处理不同的对象类型。

三、多态的优势与应用场景

1、代码复用与扩展性:多态通过提供一个通用的交互界面,使得针对不同对象类型的操作能够集中处理,从而避免了为每个具体类型编写重复的控制逻辑。

在上述示例中,多态减少了代码重复,使得添加新的动物种类时,无需修改已有的函数,只需增加新的子类即可。

2、提高工作效率:在大型项目中,多态能够帮助我们快速定位和修改问题,减少因类型检查而导致的错误,使开发更加高效。

3、实际应用场景

  • GUI编程:按钮、文本框等控件都可能需要响应“点击”事件,尽管它们的行为细节不同,但都可以通过相同的接口来处理事件。

  • 数据处理框架:如Pandas库,无论是DataFrame还是Series,都可以通过.apply()方法应用自定义函数,这是多态在实际库中的体现。

  • Web框架:如Django的视图函数可以处理不同类型的请求,只要这些请求符合预期的接口规范。

四、深入理解

为了更好地利用多态,Python提供了abc模块,用于定义抽象基类(Abstract Base Class, ABC)。抽象基类不能被实例化,其目的是为子类提供一个必须实现的接口规范。

from abc import ABC, abstractmethod

class AbstractAnimal(ABC):
    @abstractmethod
    def speak(self):
        pass

# 如果不实现speak方法,Dog类将无法实例化
class Dog(AbstractAnimal):
    def speak(self):
        return "汪汪"

# 尝试实例化未实现speak的类会报错
# class SilentAnimal(AbstractAnimal):
#     pass

# animal = SilentAnimal()  # 这里会报TypeError

好啦啦啦,今天的分享就到这里了,有喜欢的哥哥姐姐们,欢迎大家留言指点^_^如果本文对你有帮助,请点赞、转发哦

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Laravel5+mycat 报错 “Packets out of order”

背景 近期对负责项目,配置了一套 主从复制的 MySQL 集群 使用了中间件 mycat 但测试发现,替换了原来的数据连接后,会出现 Packets out of order 的报错 同时注意到,有的框架代码中竟然也会失效,比如 controller 类中&…

Mac电脑iTerm2 如何设置无限滑动

1.打开iTerm2应用 2.打开偏好设置 3.选中Profiles -> Terminal 4.选择Unlimited scrollback

Linux开发讲课33---线程实现与线程控制步骤简析

线程概述 进程是系统中程序执行和资源分配的基本单位。 每个进程都拥有自己的数据段、代码段和堆栈段,这就造成了进程在进行切换等操作时都需要有比较负责的上下文切换等动作。为了进一步减少处理机的空转时间支持多处理器和减少上下文切换开销,进程在演…

Ollama+OpenWeb UI搭建最简单的大模型交互界面

Open WebUI是一个专为大型语言模型(LLMs)设计的Web用户界面。这个界面提供了一个直观、响应迅速且易于使用的平台,使用户能够与本地运行的语言模型进行交互,就像与云服务中的模型交互一样。可以非常方便的调试、调用本地模型。你能…

Interpretability 与 Explainability 机器学习

「AI秘籍」系列课程: 人工智能应用数学基础人工智能Python基础人工智能基础核心知识人工智能BI核心知识人工智能CV核心知识 Interpretability 模型和 Explainability 模型之间的区别以及为什么它可能不那么重要 当你第一次深入可解释机器学习领域时,你会…

第十四届蓝桥杯省赛C++B组G题【子串简写】题解(AC)

题目大意 给定字符串 s s s,字符 a , b a, b a,b,问字符串 s s s 中有多少个 a a a 开头 b b b 结尾的子串。 解题思路 20pts 使用二重循环枚举左端点和右端点,判断是否为 a a a 开头 b b b 结尾的字符串,是则答案加一…

MyBatis1(JDBC编程和ORM模型 MyBatis简介 实现增删改查 MyBatis生命周期)

目录 一、JDBC编程和ORM模型 1. JDBC回顾 2. JDBC的弊端 3. ORM模型 Mybatis和hibernate 区别: 4. mybatis 解决了jdbc 的问题 二、MyBatis简介 1. MyBatis快速开始 1.1 导入jar包 1.2 引入 mybatis-config.xml 配置文件 1.3 引入 Mapper 映射文件 1.3 测试 …

构建滑块组件_第 2 部分

本篇我们继续学习滑块组件,让我们把滑块组件构建的更好; ● 首先,我们想要获取组件的三个点,首先在获取到他的HTML元素 const dotContainer document.querySelector(.dots);● 接着遍历 slides 数组,并在动态创建 元…

【MySQL】锁(黑马课程)

【MySQL】锁 0. 锁的考察点1. 概述1. 锁的分类1.1 属性分类1.2 粒度分类 2. 全局锁2.1 全局锁操作2.2.1 备份问题 3. 表级锁3.1 表锁3.2 语法3.3 表共享读锁(读锁)3.4 表独占写锁(写锁)3.5 元数据锁(meta data lock, MDL)3.6 意向…

分享实现地铁车辆侧面图

简介 通过伪类和关键帧动画实现地铁车辆侧面图 在线演示 伪元素和关键帧动画 实现代码 <!DOCTYPE html><html><head> <meta http-equiv"Content-Type" content"text/html; charsetutf-8" /> <meta http-equiv"X-UA-Co…

【免费资料】IEEE33节点系统参数及拓扑图visio

主要内容 对于初学配电网的同学&#xff0c;最经典的系统即是33节点配电网系统&#xff0c;在各个研究文献中出现频次最高的也是这个系统&#xff0c;为了让大家更好了解33节点系统参数&#xff0c;本次整理了系统节点、支路参数excel以及33节点网络拓扑图visio&#xff0c…

org.springframework.jdbc.BadSqlGrammarException异常

Bug 记录 概述 在执行定时任务更新电子书统计信息时&#xff0c;遇到了 org.springframework.jdbc.BadSqlGrammarException 异常&#xff0c;具体表现为 SQL 函数 count 被错误地解析为自定义函数 wiki.count&#xff0c;导致数据库更新操作失败。 详细描述 错误信息&#x…

adb不插usb线通过wifi调试

说起做手机开发也有好多年了&#xff0c;说来惭愧&#xff0c;我最近才知道安卓手机是可以不插数据线进行开发调试的。起因是公司近期采购了一批安卓一卡通设备&#xff0c;需要对其进行定制开发APP,但是由于我插USB调试发现没有反应。通过询问厂家才知道可以通过WIFI进行调试。…

Gradient Descent

在整个maching learning的第三个步骤要找一个最好的function。在第二步是定义了一个 Loss function L&#xff0c;这个L是一个function的fuction 求完偏微分之后得到的向量就是Gradient&#xff08;黄色部分&#xff09; 随机找一个起始点0&#xff0c;它的等高线的法线方向就…

Flash存储器解析:从原理到应用,全面了解其与缓存的区别

Flash存储器解析&#xff1a;从原理到应用&#xff0c;全面了解其与缓存的区别 Flash存储器是一种非易失性存储器技术&#xff0c;广泛应用于各种电子设备中&#xff0c;如USB闪存盘、固态硬盘&#xff08;SSD&#xff09;、智能手机、数码相机和嵌入式系统。它能够在断电情况下…

Windows使用nxlog发送系统日志到Linux的rsyslog服务器

Windows使用nxlog发送系统日志到Linux的rsyslog服务器 前言一、IP地址规划及示意图二、在windows上安装及配置nxlog1.下载nxlog2.安装nxlog3.配置nxlog4.创建对应日志路径的文件夹 三、windows上启动nxlog服务四、在CentOS 7上配置日志存到指定位置文件1.编辑/etc/rsyslog.conf…

【国产开源可视化引擎Meta2d.js】钢笔

钢笔 钢笔是和其他众多绘图工具&#xff08;Photoshop、Sketch、Illustrator&#xff09;中一致的钢笔工具&#xff0c;能够很方便的在线绘制各种小图标 在线体验&#xff1a; 乐吾乐2D可视化 示例&#xff1a; // 开始绘画&#xff1a;curve。除了curve&#xff0c;还有poly…

9 张图带你理解 Kafka 中高水位 HW

大家好&#xff0c;我是君哥。 Kafka 高水位&#xff08;简称 HW&#xff09;是 Kafka 中非常重要的一个概念&#xff0c;今天来聊一聊 HW。 1 HW 简介 HW 是 Kafka 中 Offset 的一个值&#xff0c;HW 作为一个边界&#xff0c;Offset 小于 HW 的消息被称为已提交消息&#…

让ChatGPT干正事、说人话、会思考!借助ChatGPT润出优质论文的实操指南

大家好&#xff0c;感谢关注。我是七哥&#xff0c;一个在高校里不务正业&#xff0c;折腾学术科研AI实操的学术人。关于使用ChatGPT等AI学术科研的相关问题可以和作者七哥&#xff08;yida985&#xff09;交流&#xff0c;多多交流&#xff0c;相互成就&#xff0c;共同进步&a…

Qt 文件初始化配置ini/conf类型读写

学习目标&#xff1a; 文件初始化配置 前置环境 运行环境:qt creator 4.12 学习内容 INI 文件是一种常见的配置文件格式,它通常用于存储应用程序或系统的设置和参数。INI 文件的格式很简单,由以下几个部分组成: 节(Section): 节用方括号括起来,如 [General]、[Network] 等。…