Python多态及用法详解

news2024/11/16 6:54:13

Python 是弱类型语言,其最明显的特征是在使用变量时,无需为其指定具体的数据类型。这会导致一种情况,即同一变量可能会被先后赋值不同的类对象,例如:

class CLanguage:
defsay(self):
print("赋值的是 CLanguage 类的实例对象")
class CPython:
defsay(self):
print("赋值的是 CPython 类的实例对象")
a =CLanguage()
a.say()

a =CPython()
a.say()

运行结果为:

赋值的是 CLanguage 类的实例对象
赋值的是 CPython 类的实例对象

可以看到,a 可以被先后赋值为 CLanguage 类和 CPython 类的对象,但这并不是多态。类的多态特性,还要满足以下 2 个前提条件:

  1. 继承:多态一定是发生在子类和父类之间;

  1. 重写:子类重写了父类的方法。

下面程序是对上面代码的改写:

class CLanguage:
defsay(self):
print("调用的是 Clanguage 类的say方法")
classCPython(CLanguage):
defsay(self):
print("调用的是 CPython 类的say方法")
classCLinux(CLanguage):
defsay(self):
print("调用的是 CLinux 类的say方法")
a =CLanguage()
a.say()

a =CPython()
a.say()

a =CLinux()
a.say()

程序执行结果为:

调用的是 Clanguage 类的say方法
调用的是 CPython 类的say方法
调用的是 CLinux 类的say方法

可以看到,CPython 和 CLinux 都继承自 CLanguage 类,且各自都重写了父类的 say() 方法。从运行结果可以看出,同一变量 a 在执行同一个 say() 方法时,由于 a 实际表示不同的类实例对象,因此 a.say() 调用的并不是同一个类中的 say() 方法,这就是多态。

但是,仅仅学到这里,读者还无法领略 Python 类使用多态特性的精髓。其实,Python 在多态的基础上,衍生出了一种更灵活的编程机制。

继续对上面的程序进行改写:

class WhoSay:
defsay(self,who):
        who.say()
class CLanguage:
defsay(self):
print("调用的是 Clanguage 类的say方法")

classCPython(CLanguage):
defsay(self):
print("调用的是 CPython 类的say方法")

classCLinux(CLanguage):
defsay(self):
print("调用的是 CLinux 类的say方法")
a =WhoSay()
#调用 CLanguage 类的 say() 方法
a.say(CLanguage())
#调用 CPython 类的 say() 方法
a.say(CPython())
#调用 CLinux 类的 say() 方法
a.say(CLinux())

程序执行结果为:

调用的是 Clanguage 类的say方法
调用的是 CPython 类的say方法
调用的是 CLinux 类的say方法

此程序中,通过给 WhoSay 类中的 say() 函数添加一个 who 参数,其内部利用传入的 who 调用 say() 方法。这意味着,当调用 WhoSay 类中的 say() 方法时,我们传给 who 参数的是哪个类的实例对象,它就会调用那个类中的 say() 方法。

在其它教程中,Python 这种由多态衍生出的更灵活的编程机制,又称为“鸭子模型”或“鸭子类型”。

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

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

相关文章

ElasticSearch从入门到出门【下】

文章目录数据聚合聚合的种类DSL实现聚合Bucket聚合语法聚合结果排序限定聚合范围Metric聚合语法RestAPI实现聚合API语法业务需求业务实现自动补全拼音分词器自定义分词器自动补全查询实现酒店搜索框自动补全修改酒店映射结构修改HotelDoc实体重新导入自动补全查询的JavaAPI实现…

阿里云领取免费2H2G云服务器&证书分享&个税抵扣:Apsara Clouder云计算专项技能认证:云服务器ECS入门

这个证书是你领服务器一个月内要考的,内容也不难。下面是90分左右的答案(粗体),仅供参考……单选1.云服务器ECS以服务化的方式对客户提供,阿里云产品售后支持的时间段是?A.5*8B.7*8C.7*12D.7*24…

《MySQL高级篇》十四、多版本并发控制

文章目录1. 什么是MVCC2. 快照读与当前读2.1 快照读2.2 当前读3. 复习3.1 再谈隔离级别3.2 隐藏字段、Undo Log版本链4. MVCC实现原理之ReadView4.1 什么是ReadView4.2 设计思路4.3 ReadView的规则4.4 MVCC整体操作流程5. 举例说明5.1 READ COMMITTED隔离级别下5.2 REPEATABLE …

Gerrit3.4.1安装+its插件

环境依赖jdk11安装jdk11:下载: wget https://download.java.net/openjdk/jdk11/ri/openjdk-1128_linux-x64_bin.tar.gz解压: tar zxvf openjdk-1128_linux-x64_bin.tar.gzsudo update-alternatives --install /usr/bin/java java /home/jenki…

P问题、NP问题、NPC问题、NP-Hard问题

经常听到老师讲,某一个问题(比如说,车辆路径规划问题Vehicle Routing Problem)是一个NP-Hard问题,此外,我们在阅读文章的时候,也经常会读到某一个问题是NP-Hard问题的陈述,与此同时,…

Python程序设计-第3章Python函数与模块

第3章Python函数与模块一.预习笔记 3.1 函数定义:def 函数名称 (参数1,参数2 …): 函数体 * 函数是某一个功能或者某一段程序代码的一个封装 * 函数名是用户自己定义的名称,与变量的命名规则相同,用字母开头&#x…

Java线程池个人整理笔记

一、线程池有哪些优点 总体来说,线程池有如下的优势: (1)降低资源消耗。通过重复利用已创建的线程降低线程创建和销毁造成的消耗。 (2)提高响应速度。当任务到达时,任务可以不需要等到线程创建…

配置Linux18.04系统/解决无法安装vmwatools的问题

一、解决无法安装vmwatools的问题 1.关闭虚拟机中的Linux18.04系统 2.打开虚拟机设置 3.修改所有的CD/DVD 、软盘 连接为:使用物理驱动器->自动检测(如下图) 4.打开虚拟机,都点是; 5.解决解压桌面上的vmware-…

春节特献!一文纵览2022年全球量子计算行业要闻!

(图片来源:网络)岁聿云暮,一元复始。如果说2018年是量子计算技术变革元年,那么2022年全球量子计算已正式步入市场探索加速期。随着中国、美国、欧盟等国家相继出台各种量子信息相关战略纲要和旗舰计划,越来…

数据的解析的介绍(1)

1.xpath 注意:提前安装xpath插件 (1)打开chrome浏览器 (2)点击右上角小圆点 (3)更多工具 (4)扩展程序 (5)拖拽xpath插件到扩展程序中 &#xff0…

王道操作系统笔记(五)———— 经典同步问题

前言:PV 操作题目分析步骤 关系分析: 找出题目中描述的各个进程,分析它们之间的同步、互斥关系。整理思路: 根据各进程的操作流程确定 P、V 操作的大致顺序。设置信号量: 并根据题目条件确定信号量初值。(…

数据结构与算法基础——栈和队列

栈只能在表尾进行插入删除操作 队列先进先出 队列和栈都是线性表,不过是插入和删除的 位置被限制了。 队列头进尾出

Dubbo 入门系列之基于 Dubbo API 开发微服务应用

目标 从零上手开发基于 Dubbo 的微服务 难度 低 环境要求 系统:Windows、Linux、MacOS JDK 8 及以上(推荐使用 JDK17) Git IntelliJ IDEA(可选) Docker (可选) 动手实践 本章将通过手把…

网络编程-UDP数据报套接字

专栏简介: JavaEE从入门到进阶 题目来源: leetcode,牛客,剑指offer. 创作目标: 记录学习JavaEE学习历程 希望在提升自己的同时,帮助他人,,与大家一起共同进步,互相成长. 学历代表过去,能力代表现在,学习能力代表未来! 目录 1. 网络编程基础 1.1 为什么需要网络编程? 1.2 什…

好友关注-Feed流实现方案

9.3 好友关注-Feed流实现方案 当我们关注了用户后,这个用户发了动态,那么我们应该把这些数据推送给用户,这个需求,其实我们又把他叫做Feed流,关注推送也叫做Feed流,直译为投喂。为用户持续的提供“沉浸式”…

简聊商城项目的表设计

零、前言 1、优惠卷设计 电商项目中的优惠券系统这样设计,同事直呼 666 ! 2、SPU和SKU的定义及他们之间的关系 SPU全称Standard Product Unit,即标准化产品单元。 简单理解就是某一种产品。 SKU全称Stock Keeping Unit,即库存量…

ChatGPT官方API可以抢先体验了

ChatGPT官方API目前还在内测当中,OpenAI官网上也没有任何接口介绍和文档。这对于开发和调用来说不怎么方便。但是,比较好的地方在于内测过程中调用是免费的,没有次数限制。此外,API接口调用不需要梯子或代理(使用代理反…

【原创】如何做一张原创8BIT音乐的NES音乐卡片

我陷入了深思。。。。。。 第一步是创作一首8BIT音乐。我介绍两个NES用的音乐工具:FamiTracker 和 FamiStudio。 选FamiTracker的原因是,有完美教程呀。红鸡将他的教程放到B站了:红激教你做音乐 一共11集,非常亲民地道的教学&a…

C++11 lambda表达式

作者:小萌新 专栏:C进阶 作者简介:大二学生 希望能和大家一起进步! 本篇博客简介:介绍C11的lambda表达式 lambda表达式lambda表达式的概念lambda表达式语法lambda表达式交换两个数lambda表达式的底层原理lambda表达式的…

【ChatGPT 中文版小程序】无需注册体验 ChatGPT 的攻略

本文导读什么是ChatGPT?ChatGPT能做什么?功能测试如何解锁有趣功能?我想部署同样的一个小程序,请问如何做?什么是ChatGPT? 最近网上非常火爆的CHATGPT,它是OpenAI开发的一款开源的自然语言处理…