Python编程的面向对象(二)—类的多态

Python编程的面向对象(二)—类的多态

在面向对象编程中,多态是一种重要的概念,指的是不同类的对象可以对相同的消息作出响应,表现出不同的行为。多态允许使用基类的引用来调用派生类的方法,实现了接口的统一。

多态的特点:

  • 多态性:相同的函数名但是具有不同的行为。
  • 灵活性:通过多态性,可以根据对象的实际类型来调用相应的方法。
  • 简化代码:实现多态性可以减少代码的复杂性,提高代码的可读性和可维护性。
多态示例代码(1):

下面是一个简单的 Python 示例,演示了多态的概念:

# 定义动物类 Animal
class Animal:def speak(self):pass# 定义子类 Dog 和 Cat,它们继承自 Animal
class Dog(Animal):def speak(self):return "Woof!"class Cat(Animal):def speak(self):return "Meow!"# 函数接受 Animal 类的实例并调用 speak 方法
def animal_speak(animal):return animal.speak()# 创建 Dog 和 Cat 对象,并调用 speak 方法
dog = Dog()
cat = Cat()print(animal_speak(dog))  # 输出: Woof!
print(animal_speak(cat))  # 输出: Meow!

在这个示例中:

  • Animal 是基类,定义了 speak 方法。
  • DogCat 分别是派生类,它们重写了 speak 方法,表现出不同的行为。
  • animal_speak 函数以 Animal 类的对象为参数,调用其 speak 方法,实现了多态性。

通过多态性,即使我们传入不同类型的动物对象,animal_speak 函数也能根据实际的对象类型调用正确的方法来产生不同的行为,展现了多态的特性。

多态示例代码(2):
class Canvas:def draw_pic(self, shape):print('\n-- 开始绘图 --')shape.draw(self)class Rectangle:def draw(self, canvas):print('开始绘制矩形')class Circle:def draw(self, canvas):print('开始绘制圆形')class Triangle:def draw(self, canvas):print('开始绘制三角形')class Line:def draw(self, canvas):print('开始绘制直线')class Arc:def draw(self, canvas):print('开始绘制圆弧')c = Canvas()# 传人Rectangle参数,绘制矩形
c.draw_pic(Rectangle())
# 传入Triangle参数,绘制三角形
c.draw_pic(Triangle())
# 传人Circle参数,绘制圆形
c.draw_pic(Circle())
# 传入Line参数,绘制直线
c.draw_pic(Line())
# 传入Arc参数,绘制圆弧
c.draw_pic(Arc())

类Canvas的draw_pic()方法需要传入一个shape参数,该方法就是调用shape参数的draw()方法将自己绘制到画布上。Canvas的draw_pic()传入的参数对象只要带一个draw()方法即可,至于该方法具有何种行为(到底执行怎样的绘制行为),这与draw_pic()方法是完全分离的,这就为编程增加了很大的灵活性。

运行结果如下:

-- 开始绘图 --
开始绘制矩形-- 开始绘图 --
开始绘制三角形-- 开始绘图 --
开始绘制圆形-- 开始绘图 --
开始绘制直线-- 开始绘图 --
开始绘制圆弧

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

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

相关文章

CAPL学习之路-TLS函数

The Transport Layer Security (TLS) Protocol,传输层安全协议。通常是基于TCP传输协议基础上的安全认证协议,不用在UDP上。 为什么TLS不用在UDP协议上? UDP本身就不是一个可靠的协议,你在一个不可靠的协议上进行安全认证,就像是没打地基就想确保房子坚固,这可能吗? 常…

【Camera KMD ISP SubSystem笔记】CAM SYNC与DRQ①

在android系统中fence用于不同模块需要访问同一块buffer的同步,例如camera和graphic。对于preview buffer, camera是生产者graphic是消费者。 camera需要生产图像数据到preview buffer时需要等待preview buffer的 fence可用。 camera sync是高通camx框架里面用于各个…

C/C++常用开源库总结

文章目录 库名主要功能和组件语言miniftpd研究简单的ftp服务器Cmuduo的研究目录记录学习muduo库的一些笔记Cyaziyazi封装的json解析库、ini解析库、xml解析库、简单的基于TCP的多线程服务器–ZeroMQ––Abseil字符串操作: Abseil 提供了一套强大而灵活的字符串处理工具&#xf…

ROS Node

ROS Node ROS(Robot Operating System)节点是指在ROS中运行的基本单元,它们是一个独立的进程,执行特定的任务,并与其他节点进行通信以完成更复杂的功能。ROS节点是ROS中实现模块化、分布式和可扩展性的关键组件之一。…

【LeetCode】191. 位1的个数

题目链接:191. 位1的个数 题目描述: 解法1:题意很简单就不说了,这里先说一种最简单的解法,首先我们知道一点:n&(n-1)相当于把是将n的二进制位中最低位的1变为了0,其它位保持不变&#xff0…

强制内容在一行显示

强制内容在一行显示 .one {white-space: nowrap;overflow: hidden;text-overflow: ellipsis; /* 可选,当内容超出一行时,用省略号表示 */ }效果

【机器学习】概率模型在机器学习中的应用:以朴素贝叶斯分类去为例

概率模型在机器学习中的应用:以朴素贝叶斯分类器为例 一、概率模型的基本原理二、朴素贝叶斯分类器的原理与实现三、朴素贝叶斯分类器的应用与挑战四、结论与展望 在大数据与人工智能时代,概率模型在各个领域发挥着至关重要的作用。概率模型以概率论和统…

基于STM32F4系列的ETH IAP在线升级程序

目录 1、前言 2、以太网的移植(无操作系统) 3、移植FATS 系统 4、移植ETH 驱动及 DP83848驱动 5、Tftp 服务程序 6、注意事项 ​7、代码 资料下载地址:基于STM32F4系列的ETH IAP在线升级程序 1、前言 此bootloader程序可以通过http…

网络爬虫之HTTP原理

** URI和URL URI的全称Uniform Resource Identifier ,即统一资源标志符。URL的全称Uniform Resource Locator 即统一资源定位符。 URL是URI的子集,也就是每一个URL就是URI,但是每一个URI不一定是URL,URI还有一个子类叫URN&#x…

从零开始写 Docker(十二)---实现 mydocker stop 停止容器

本文为从零开始写 Docker 系列第十二篇,实现类似 docker stop 的功能,使得我们能够停止指定容器。 完整代码见:https://github.com/lixd/mydocker 欢迎 Star 推荐阅读以下文章对 docker 基本实现有一个大致认识: 核心原理&#x…

[韭]第一次参加护网行动要注意什么??

前言 为什么要写这篇文章呢,一是对当下安全环境进行一个分析,二是以过来人的身份留下一点经验。 当下安全环境分析 现在这个时代,大家都已经踏上了信息高速公路,可以自己拿搜索引擎搜一下自己知道的大厂裁员情况,有…

油猴脚本:bing 搜索结果居中

文章目录 效果预览脚本使用步骤安装油猴脚本添加脚本 效果预览 脚本 // UserScript // name bing居中 // namespace http://tampermonkey.net/ // version 2024-04-24 // description try to take over the world! // author You // match http…

rust 卸载重新安装 安装

原因:接触区块链时报错 linking with x86_64-w64-mingw32-gcc failed: exit code: 1 Rust编译需要C环境,如果你没有,Rust也能安装成功,只是无法编译代码 C的编译工具有两个,一个是msvc,也就是visual studi…

CTFshow-PWN-栈溢出(pwn44)

64位的 system(); 但是好像没"/bin/sh" 上面的办法不行了,想想办法 检查: 是 64 位程序 ida 反编译 main 函数: 跟进 ctfshow 函数: 存在栈溢出 offset:0xAh8 在前面经验的基础上,这里我们直…

Python-VBA函数之旅-issubclass函数

目录 一、issubclass函数的常见应用场景: 二、issubclass函数使用注意事项: 三、如何用好issubclass函数? 1、issubclass函数: 1-1、Python: 1-2、VBA: 2、推荐阅读: 个人主页&#xff…

Linux下载及安装OpenSSL

文章目录 前言一、OpenSSL下载二、OpenSSL安装1.上传下载好的安装包到服务器2.解压3.切换目录4.配置config5.编译6.安装7.备份旧版本OpenSSL7.创建软链接8.添加OpenSSL动态链接库9.更新库缓存10.查看OpenSSL版本验证安装是否成功 前言 一般系统会自带有OpenSSL,我们…

CV新手的一些细节点记录

文章目录 前言 一、CV是什么? 二、细节点记录 1.图像坐标与图像矩阵 2.透视变换 总结 前言 很早之前就听闻计算机视觉,尔后又听闻机器学习,一个个高大上的大名,让人有种可望而不可及的感觉。 某日入坑其中,其实…

ubuntu 24.04 beta server NAT模式上网设置

在Ubuntu 24.04 Beta上设置网络通常涉及使用命令行工具。以下是设置静态IP地址和动态IP地址的步骤: 动态IP设置: 查找你的网络接口名称: ip a ens37是我NAT模型的一张网卡,此时是没有ip的。 下面介绍如何NAT模式下添加DHCP动态…

xmind思维导图的绘制技巧

思维导图是一种用来表示思维关系的图形化工具。它将复杂的思维过程和信息整理成一个树状图,可以帮助我们更好地理清思路、整理信息、记忆知识。 在使用xmind绘制思维导图时,有一些技巧可以帮助我们更高效地绘制出清晰、易读的导图,下面是一些…

【数据结构与算法】:带你手搓顺序表(C/C++篇)

文章目录 一、顺序表1.1 线性表 二、顺序表2.1 概念及结构2.2 实现方法1. 顺序表的初始化2. 顺序表的销毁3. 扩容4. 尾部插入/尾部删除5. 头部插入/头部删除6. 指定位置插入/删除7. 顺序表的查找8. 顺序表元素的索引9. 顺序表元素的修改10. SeqList.c完整代码 一、顺序表 1.1 …