Python 面向对象——5.多态

本章学习链接如下:

Python 面向对象——1.基本概念

Python 面向对象——2.类与对象实例属性补充解释,self的作用等

Python 面向对象——3.实例方法,类方法与静态方法

Python 面向对象——4.继承 

1.基本概念

多态是面向对象编程(OOP)的一个核心概念,指的是不同类的对象可以通过同一接口(即相同的方法或属性)执行不同的操作。

Python 的内置函数 len() 是多态性的一个非常好的例子。len() 函数能够接受不同类型的参数,比如列表、字符串、元组、字典等,并返回这些数据结构的长度。尽管这些数据类型在内部结构上可能完全不同,len() 仍然可以处理它们,因为它们共享一个公共接口,即它们都是可迭代的,并且实现了返回集合大小的内部方法。

比如如下代码:

len() 函数分别用于字符串、列表和字典。尽管这些类型在内部数据的存储和处理方式上有所不同,len() 函数都能够返回正确的长度,这表明 len() 函数展示了多态行为。

# 对字符串使用 len()
print(len("Hello"))  # 输出: 5

# 对列表使用 len()
print(len([1, 2, 3, 4]))  # 输出: 4

# 对字典使用 len()
print(len({1: 'one', 2: 'two', 3: 'three'}))  # 输出: 3

len() 实际上调用了对象的 __len__() 方法。因此,任何想要支持 len() 函数的自定义类都应该实现一个 __len__() 方法。 在下面这个代码中,BookCollection 类定义了 __len__() 方法,该方法返回集合中书籍的数量。当 len() 被调用时,它实际上调用的是 my_books.__len__(),这符合多态的概念,因为 len() 可以与任何定义了 __len__() 方法的对象一起工作,而不需要关心对象的具体类型。

class BookCollection:
    def __init__(self, books):
        self.books = books
    
    def __len__(self):
        return len(self.books)

# 创建一个BookCollection实例
my_books = BookCollection(["Book1", "Book2", "Book3"])

# 使用len()
print(len(my_books))  # 输出: 3

2.代码示例

下面是一个使用Python实现多态的示例,其中定义了两个类:DogCat,它们都继承自一个名为Animal的基类。这些类都实现了一个make_sound()方法,该方法在每个类中表现不同。

在这个示例中:

  • Animal类中定义了一个名为make_sound的方法。这个方法是实例方法,因为它的第一个参数是self,它代表类的实例。make_sound方法中没有提供任何实现,而是抛出了一个NotImplementedError异常。这意味着Animal类中的make_sound方法是一个抽象方法,它要求任何继承自Animal的子类都必须实现这个方法。这是多态性的一种实现方式,允许不同的子类以不同的方式实现相同的接口。
  • DogCat类继承了Animal类,并实现了各自版本的make_sound()方法。Dog类重写了make_sound方法,并提供了一个实现,当调用时返回字符串"Woof!"Cat的类,它也继承自Animal类。Cat类同样重写了make_sound方法,并提供了一个实现,当调用时返回字符串"Meow!"
  • animal_sound()函数接受任何Animal的实例作为参数,并调用其make_sound()方法。函数内部调用传入对象的make_sound方法,并将结果打印出来。这里利用了多态性,因为animal参数可以是任何继承自Animal类的实例,而函数并不关心传入的是哪种具体的动物。

 

class Animal:
    def make_sound(self):
        raise NotImplementedError("Subclasses must implement this method")

class Dog(Animal):
    def make_sound(self):
        return "Woof!"

class Cat(Animal):
    def make_sound(self):
        return "Meow!"

def animal_sound(animal):#定义了一个名为animal_sound的函数,它接受一个参数animal。
    print(animal.make_sound())

# 创建Dog和Cat的实例
dog = Dog()
cat = Cat()

# 通过相同的接口调用不同的实现
animal_sound(dog)
animal_sound(cat)

 

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

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

相关文章

2024,2025(专家期)

2024,2025(专家期) 目录概述需求: 设计思路实现思路分析1.另一种的方式: 2.按照自己的职业规划进行发展 参考资料和推荐阅读 Survive by day and develop by night. talk for import biz , show your perfect code,ful…

安全小课堂丨什么是暴力破解?如何防止暴力破解

什么是暴力破解? 暴力破解也可称为穷举法、枚举法,是一种比较流行的密码破译方法,也就是将密码进行一一推算直到找出正确的密码为止。比如一个6位并且全部由数字组成的密码,可能有100万种组合,也就是说最多需要尝试10…

学习配置文件

1.yml的语法格式问题: 2.配置文件获取数据: Value方式: Environment: 获取自定义对象的方式: 设置get和set方法,还有toString方法。 3. 日志配置: logo的配置: 日志插件&#xff…

SpringBoot xxl-job 任务调度

首先官网下载xxl-job的源代码,然后切换到jdk8,等Maven下载依赖 执行mysql的脚本,修改连接配置,启动admin站点 默认地址 http://localhost:8080/xxl-job-admin/ 先新增一个任务执行器,指向未来任务代码的站点 然后在…

[论文笔记] EcomGPT:COT扩充数据的电商大模型

社区供稿 | EcomGPT:基于任务链数据的电商大模型(附魔搭推理实践) - 知乎 https://arxiv.org/pdf/2312.15696.pdf EcomInstruct指令数据集构建 数据集组成 COT方式构造垂域训练数据:把原本的垂域任务分解成了原子任务,构造了基于解决原子任务的数据。这样能用类似…

OpenTelemetry-2.Go接入Jaeger(grpc,gin-http)

目录 1.什么是OpenTelemetry 2.搭建jaeger 3.链路追踪 本地调用 远程调用 GRPC proto server端 client端 Gin-HTTP 调用流程 api1 api2 grpc 4.完整代码 1.什么是OpenTelemetry 参考:OpenTelemetry-1.介绍-CSDN博客 2.搭建jaeger 参考:…

Rest微服务案例

Rest 父工程构建microservicecloud-api公共子模块Modulemicroservicecloud-provider-dept-8001部门微服务提供者Modulemicroservicecloud-consumer-dept-80部门微服务消费者Module 以Dept部门模块做一个微服务通用案例 Consumer消费者(Client)通过REST调…

阿里开源黑白图片上色算法DDColor的部署与测试并将模型转onnx后用c++推理

阿里开源黑白图片上色算法DDColor的部署与测试并将模型转onnx后用c推理 文章目录 阿里开源黑白图片上色算法DDColor的部署与测试并将模型转onnx后用c推理简介环境部署下载源码安装环境下载模型 测试一下看看效果模型转onnx测试一下生成的onnx模型看看效果C 推理 简介 DDColor是…

代码随想录算法训练营DAY32|C++贪心算法Part.2|122.买卖股票的最佳时机II、55.跳跃游戏、45.跳跃游戏II

文章目录 122.买卖股票的最佳时机II思路CPP代码 55.跳跃游戏思路CPP代码 45.跳跃游戏II思路方法一代码改善 CPP代码 122.买卖股票的最佳时机II 力扣题目链接 文章讲解:122.买卖股票的最佳时机II 视频讲解: 状态:本题可以用动态规划&#xff0…

Linux进程地址空间及其页表

文章目录 一、引言二、Linux进程地址空间的概念1、进程地址空间定义2、进程地址空间的组成3、进程地址空间与物理内存的关系 三、页表与内存映射1、页表的定义及作用2、页表的缺页中断 三、进程的写时拷贝 一、引言 在Linux中,进程管理是其核心功能之一&#xff0c…

OpenCV如何实现拉普拉斯算子的离散模拟

返回:OpenCV系列文章目录(持续更新中......) 上一篇:OpenCV的Sobel 衍生品 下一篇 :OpenCV 如何实现边缘检测器 目标 在本教程中,您将学习如何: 使用 OpenCV 函数 Laplacian() 实…

Docker基本管理和虚拟化

一、docker的发展历史 https://www.cnblogs.com/rongba/articles/14782624.htmlhttps://www.cnblogs.com/rongba/articles/14782624.html 二、docker的概述 Docker是一个开源的应用容器引擎,基于go语言开发并遵循了apache2.0协议开源。 Docker是在Linux容器里运行…

Amazon云计算AWS之[2]弹性计算云EC2

文章目录 说明EC2基本架构Amazon机器映象(AMI)实例(Instance)弹性块存储(EBS) EC2关键技术地理区域和可用区域EC2通信机制弹性负载均衡监控服务自动缩放服务管理控制台 EC2安全及容错机制EC2弹性IP地址 说明…

开曼群岛:Web3企业的乐园

开曼群岛:Web3企业的理想之地 开曼群岛,在数字革命中大放异彩。近年来,该地区成立的Web3企业数量显著增加,如果保持目前的发展速度,并持续优化立法,那么扩展的速度将无可限量。本文将探讨推动这一增长的关…

使用Pycharm运行spark实例时没有pyspark包(ModuleNotFoundError: No module named ‘py4j‘)

一、问题描述 在安装并配置pyspark,下载并打开Pycharm(专业版)后进行spark实例操作(笔者以统计文件中的行数为例)时,运行程序后提示ModuleNotFoundError: No module named py4j: 二、解决办法 …

小程序线多点路图绘制

需求 当接口返回一连串地图坐标,需要根据这些坐标串联起来,形成一个线路图(本次使用步行导航线路图)。 思路 首先优先想到使用小程序Map组件的polyline属性去进行展示。但是我们发现直接使用该属性进行坐标绘制画出来的数据都是…

恶补《操作系统》2_1——王道学习笔记

2操作系统-进程 2.1_1 进程的定义、组成、组织方式、特征 组成:PCB(进程存在唯一的标志),程序段,数据段 组织方式:链接方式,指针指向不同的队列;索引方式,索引表 特征…

fnm:Rust开发的高效Node版本管理工具

简介 fnm 是一个基于 Rust 开发的 Node 版本管理工具,它的目标是提供一个快速、简单且可靠的方式来管理 Node.js 的不同版本。同时,它是跨平台的,支持 macOS、Linux、Windows。🚀 Fast and simple Node.js version manager, buil…

ISP比普通的静态代理相比有什么优势?

ISP(Internet Service Provider),即互联网服务提供商,是向广大用户综合提供互联网接入业务、信息业务、增值业务的电信运营商。而静态代理则是一个固定不变的代理IP地址,具有稳定性强、兼容性好和管理方便等特点。当我…

QT中基于TCP的网络通信

QT中基于TCP的网络通信 QTcpServer公共成员函数信号 QTcpSocket公共成员函数信号 通信流程服务器端通信流程代码 客户端通信流程代码 使用Qt提供的类进行基于TCP的套接字通信需要用到两个类: QTcpServer:服务器类,用于监听客户端连接以及和客…