Python 面向对象——5.多态

news2024/11/18 3:41:02

本章学习链接如下:

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.coloradmin.cn/o/1619606.html

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

相关文章

【智慧园区、低碳园区】工业园区综合能源管理系统解决方案

安科瑞薛瑶瑶18701709087 ◆行业特点 产业园区是国民经济发展的重要载体, 同时也是重点用能企业聚集地。园区面积大,供电距离远,建筑多且分散,用电负荷种类多,用电负荷不均匀,园区配电结构应整体规划,统一…

Xshell7免费版下载及安装(详细教程)

Xshell7免费版下载及安装(详细教程) 一、下载及安装 1.打开官网下载 https://www.xshell.com/zh/free-for-home-school/ 2.选择合适的下载路径 点击下载按钮 开始下载 3.下载完成后 我们双击打开.exe文件 点击下一步 4.点击我同意 点击下一步 5.选择合…

第九讲 - Java面向对象

第九讲 - Java面向对象 文章目录 第九讲 - Java面向对象1. 类和对象1.1 类和对象的理解1.2 类的定义1.3 对象的使用1.4 学生对象-练习 2. 对象内存图2.1 单个对象内存图2.2 多个对象内存图 3. 成员变量和局部变量3.1 成员变量和局部变量的区别 4. 封装4.1 封装思想4.2 private关…

IIS中搭建.Net Core项目,步骤详解

一、准备服务器 1)安装IIS 这个比较简单,百度一下就行 2)安装 .NET Core 运行时 下载地址:下载 .NET(Linux、macOS 和 Windows) 因为我是本地开发,所以我下载的是SDK 安装成功之后显示如下: 检查是否安装…

浏览器兼容模式怎么设置?4个提升网页兼容性秘笈分享!

“不知道怎么回事,我打开浏览器的时候总是显示浏览器不兼容,是什么情况呢?我应该怎么操作才能解决这个问题呀?” 浏览器兼容模式是一种使浏览器能够更好地显示网页内容、提高网页加载速度并减少错误的功能。 不同浏览器设置兼容模…

探索HSE化工安全系统在化工生产中的作用

在现代工业化生产中,化工企业扮演着至关重要的角色,但与此同时,化工安全问题也备受关注。为了保障生产环境的安全,HSE化工安全系统应运而生。本文将详细介绍HSE化工安全系统的功能和优势,让您深入了解其在工业生产中的…

ISPLSI1032E-100LT 封装TQFP100 LATTICE/莱迪斯 IC芯片

ISPLSI1032E-100LT 规格信息: 封装:TQFP 逻辑门数量:6000 含铅标准:Lead free RoHS标准:Compliant 产品生命周期:Not Recommended ISPLSI1032E-100LT 是 Lattice Semiconductor 公司生产的一款 Complex Programmable Logic Device (CPLD),中文称为复…

AIGC技术:行业应用案例与未来可能性深度解析

随着人工智能技术的飞速发展,AIGC(人工智能生成内容)技术正日益成为引领内容创作与智能应用的新引擎。在当下,AIGC技术已经取得了一系列令人瞩目的成果,而在未来,它更将展现出无限的可能性,为人…

FebHost:.DE域名能否用于多个市场的国际网站?

.DE德国域名可用于面向多个市场的国际网站,但重要的是要考虑有效的国际搜索引擎优化的影响和策略。下面介绍在这种情况下如何利用 .DE 域名: 本地信任和信誉: .DE 域名可以向用户和搜索引擎表明,您的网站是为德国市场量身定制的。…

面对亚马逊FBA仓附加费上涨,卖家如何破局前行?

跨境电商的发展势头强劲,不仅为消费者带来了更多元化的购物选择,也为卖家提供了更广阔的市场空间,跨境物流作为连接生产与消费的重要桥梁,其成本对于卖家而言,已成为影响竞争力的关键因素之一。然而,从五月…

嵌入式4-23 C++

值不能改变 语法错误 指向地址不能改变 值和地址都不能改变 值不能改变 地址不能改变 都不能改变

【漏洞复现】卡车卫星定位系统 /user/create接口处存在未授权密码重置漏洞

免责声明:文章来源互联网收集整理,请勿利用文章内的相关技术从事非法测试,由于传播、利用此文所提供的信息或者工具而造成的任何直接或者间接的后果及损失,均由使用者本人负责,所产生的一切不良后果与文章作者无关。该…

Golang | Leetcode Golang题解之第46题全排列

题目: 题解: func permute(nums []int) [][]int {var (n len(nums)dfs func(vals []int) // 已选择数 排列为vals 后续回溯继续选择 直至选完ans [][]int)dfs func(vals []int) {//边界if len(vals) n {ans append(ans, vals)}//转移 枚举选哪个f…

聚观早报 | 百度地图V20正式发布;OPPO K12细节曝光

聚观早报每日整理最值得关注的行业重点事件,帮助大家及时了解最新行业动态,每日读报,就读聚观365资讯简报。 整理丨Cutie 4月24日消息 百度地图V20正式发布 OPPO K12细节曝光 Meta宣布开放VR系统 三星 Galaxy Ring提供多种尺寸 Redmi …

计算机网络学习笔记(七):网络安全

目录 7.1 网络安全问题概述 7.1.1 计算机网络面临的安全性威胁 7.1.2 安全的内容 7.1.3 数据加密模型 7.2 两类密码体制 7.2.1 对称密钥密码体制(对称加密、加密密钥和解密密钥相同) 7.2.2 公钥/公开密钥密码体制(非对称加密、加密密钥…

数据可视化———Tableau

基本认识: 维度:定性—字符串文本,日期和日期时间等等 度量:定量—连续值,一般属于数值 数据类型: 数值 日期/日期时间 字符串 布尔值 地理值 运算符 算数运算符:加减乘除,%取余,…

如何在Facebook上发布广告?

在广告管理工具中创建广告 创建广告系列和广告组。在广告名称文本框中输入描述性名称。选择代表您业务的Facebook 公共主页和Instagram 帐户。 所有广告都必须具有关联的Facebook 公共主页。选择广告格式。 选择素材。 您可能还会看到其他选项,具体取决于您先前所做…

论文| Visual Place Recognition: A Tutorial

本文是有关 VPR 的第一篇教程文章(提供每个功能模块的开源代码)。涵盖了 VPR 问题的表述、通用算法pipeline、评估方法、主要挑战及其解决方法等主题。

电商API采集的优势、使用场景,如何实时获取主流电商API数据

电商API采集简介 随着电子商务行业的快速发展,电商API采集成为了许多电商平台和企业的重要工具。API(应用程序接口)是不同软件系统之间进行数据交互的协议,通过API采集,电商平台可以方便地获取其他电商平台的商品信息…

Nessus2024.4.18.1

Nessus号称是世界上最流行的漏洞扫描程序,全世界有超过75000个组织在使用它。该工具提供完整的电脑漏洞扫描服务,并随时更新其漏洞数据库。Nessus不同于传统的漏洞扫描软件,Nessus可同时在本机或远端上遥控,进行系统的漏洞分析扫描…