面向对象编程之多态性与鸭子类型

2023-10-31

目录

一、什么是多态?

二、多态性

三、abc抽象类模块

四、鸭子类型

六、总结


一、什么是多态?

一类事物有多种不同的形态,如:动物有猫、狗、鸡等。

二、多态性

所谓多态性指的是不管各对象是什么数据类型就直接使用各对象中统一的方法函数。 从一定程度上增强了程序的灵活性和可扩展性。

实现条件:

①子类要继承父类

②子类与父类具有相同的方法函数。

class Animal: #同一类事物:动物
    def talk(self):
        pass
class Cat(Animal): #动物的形态之一:猫
    def talk(self):
        print('喵喵喵')
class Dog(Animal): #动物的形态之二:狗
    def talk(self):
        print('汪汪汪')
class Pig(Animal): #动物的形态之三:猪
    def talk(self):
        print('哼哼哼')
 
#实例化得到三个对象
>>> cat=Cat()
>>> dog=Dog()
>>> pig=Pig()

#使用统一的函数接口来调用各对象统一的方法

>>> def Talk(animal):
...     animal.talk()
... 
>>> Talk(cat)
喵喵喵
>>> Talk(dog)
汪汪汪
>>> Talk(pig)
哼哼哼

三、abc抽象类模块

定义抽象父类。抽象父类本身不能实例化,而是用来限制子类必须要有的方法函数,否则子类在实例化对象时会报类型错误。

import abc
 
# 指定metaclass属性将类设置为抽象类,抽象类本身只是用来约束子类的,不能被实例化
class Animal(metaclass=abc.ABCMeta):
    @abc.abstractmethod # 该装饰器限制子类必须定义有一个名为talk的方法
    def talk(self): # 抽象方法中无需实现具体的功能
        pass
 
class Cat(Animal): # 但凡继承Animal的子类都必须遵循Animal规定的标准
    def talk(self):
        pass
 
cat=Cat() # 若子类中没有一个名为talk的方法则会抛出异常TypeError,无法实例化

四、鸭子类型

不管某物对象是不是真正的鸭子,只要外观(属性)和行为(方法)上看起来像鸭子,那么就认为它就是个鸭子。例如: 定义两个属性和方法都相同的、但没有继承关系的类(具有多态性)。

#二者看起来都像文件,因而就可以当文件一样去用,然而它们并没有直接的关系
class Txt: #Txt类有两个与文件类型同名的方法,即read和write
    def read(self):
        pass
    def write(self):
        pass
 
class Disk: #Disk类也有两个与文件类型同名的方法:read和write
    def read(self):
        pass
    def write(self):
        pass

六、总结

1、多态:  一类事物有多种不同的形态,如动物有猫、狗、鸡。
2、多态性:  不管对象是什么数据类型,直接使用各对象统一的方法函数(实现条件:○子类继承父类○子类和父类具有相同的方法函数)。
 3、abc模块:定义抽象父类。抽象父类本身不能实例化,而是用来限制子类必须要有的方法函数,否则子类在实例化对象时会报类型错误。
import abc
# 指定metaclass属性将类设置为抽象类,抽象类本身只是用来约束子类的,不能被实例化
class Animal(metaclass=abc.ABCMeta):
    @abc.abstractmethod # 该装饰器限制子类必须定义有一个名为talk的方法
    def talk(self): 
    pass

4、鸭子类型:不管某物对象是不是真正的鸭子,只要外观(属性)和行为(方法)上看起来像鸭子,那么就认为它就是个鸭子。例如: 定义两个属性和方法都相同的、但没有继承关系的类(具有多态性)。

@声明:“山月润无声”博主知识水平有限,文章如有不妥之处欢迎广大IT爱好者指正,小弟定当虚心受教!

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

面向对象编程之多态性与鸭子类型 的相关文章

  • 递归 lambda 表达式可能吗?

    我正在尝试编写一个调用自身的 lambda 表达式 但我似乎找不到任何语法 或者即使它是可能的 本质上我想将以下函数传输到以下 lambda 表达式中 我意识到这是一个愚蠢的应用程序 它只是添加 但我正在探索可以在 python 中使用 l
  • 如何在Python中流式传输和操作大数据文件

    我有一个相对较大 1 GB 的文本文件 我想通过跨类别求和来减小其大小 Geography AgeGroup Gender Race Count County1 1 M 1 12 County1 2 M 1 3 County1 2 M 2
  • 使用 pygame 显示 unicode 符号

    我检查了其他答案 但不明白为什么我的代码错误地显示 This is what I currently see https i stack imgur com 8tNIK png 这是关于文本渲染的相关代码 font pygame font
  • 检查 Python 中的可迭代对象中的所有元素的谓词是否计算为 true

    我很确定有一个常见的习语 但我无法通过谷歌搜索找到它 这是我想做的 用Java Applies the predicate to all elements of the iterable and returns true if all ev
  • Pandas:如果单元格包含特定文本则删除行

    pandas 中的这段代码不起作用 如果该列包含提供的任何文本 数字 我希望它删除该行 目前 我只能在单元格与我的代码中传递的确切文本匹配时才能使其工作 因为它只删除显示 Fin 的单元格不是金融或金融 df2 df df Team Fin
  • 在没有模型的情况下将自定义页面添加到 django admin

    我正在尝试在没有模型关联的情况下向管理员添加自定义页面 这就是我迄今为止所取得的成就 class MyCustomAdmin AdminSite def get urls self from django conf urls import
  • 如何在 Python 中加密并在 Java 中解密?

    我正在尝试在 Python 程序中加密一些数据并将其保存 然后在 Java 程序中解密该数据 在Python中 我像这样加密它 from Crypto Cipher import AES KEY 1234567890123456789012
  • 没有名为 StringIO 的模块

    我有Python 3 6 我想从另一个名为 run py 的 python 文件执行名为 operation py 的 python 文件 In operation py I do from cStringIO import StringI
  • 在 Django OAuth Toolkit 中安全创建新应用程序

    如何将 IsAdminUser 权限添加到 Django OAuth Toolkit 中的 o applications 视图 REST FRAMEWORK DEFAULT PERMISSION CLASSES rest framework
  • 如何使用文本相似性删除 pandas 数据框中相似(不重复)的行?

    我有数千个数据 这些数据可能相似也可能不相似 使用 python 的默认函数 drop duplicates 并没有真正的帮助 因为它们只检测相似的数据 例如 如果我的数据包含类似以下内容怎么办 嗨 早上好 嗨 早上好 Python 不会将
  • Emacs 24.x 上的 IPython 支持

    我对 IPython 与 Emacs 的集成感到困惑 从 Emacs 24 开始 Emacs 附带了自己的python el 该文件是否支持 IPython 还是仅支持 Python 另外 维基百科 http emacswiki org e
  • Django send_mail SMTPSenderRefused 530 与 gmail

    一段时间以来 我一直在尝试使用 Django 从我正在开发的网站接收电子邮件 现在 我还没有部署它 并且我正在使用Django开发服务器 我不知道这是否会影响它 这是我的 settings py 配置 EMAIL BACKEND djang
  • 使用 python 绘制正值小提琴图

    我发现小提琴图信息丰富且有用 我使用 python 库 seaborn 然而 当应用于正值时 它们几乎总是在低端显示负值 我发现这确实具有误导性 尤其是在处理现实数据集时 在seaborn的官方文档中https seaborn pydata
  • ANTLR 获取并拆分词法分析器内容

    首先 对我的英语感到抱歉 我还在学习 我为我的框架编写 Python 模块 用于解析 CSS 文件 我尝试了 regex ply python 词法分析器和解析器 但我发现自己在 ANTLR 中 第一次尝试 我需要解析 CSS 文件中的注释
  • 返回表示每组内最大值的索引的一系列数字位置

    考虑一下这个系列 np random seed 3 1415 s pd Series np random rand 100 pd MultiIndex from product list ABDCE list abcde One Two T
  • SocketIO + Flask 检测断开连接

    我在这里有一个不同的问题 但意识到它可以简化为 如何检测客户端何时从页面断开连接 关闭其页面或单击链接 换句话说 套接字连接关闭 我想制作一个带有更新用户列表的聊天应用程序 并且我在 Python 上使用 Flask 当用户连接时 浏览器发
  • 在系统托盘中隐藏 tkinter 窗口 [重复]

    这个问题在这里已经有答案了 我正在制作一个程序来提醒我朋友的生日 这样我就不会忘记祝福他们 为此 我制作了两个 tkinter 窗口 1 First one is for entering name and birth date 2 Sec
  • 从 pandas DataFrame 中删除少于 K 个连续 NaN

    我正在处理时间序列数据 我在从数据帧列中删除小于或等于阈值的连续 NaN 时遇到问题 我尝试查看一些链接 例如 标识连续 NaN 出现的位置以及计数 Pandas NaN 孔的游程长度 https stackoverflow com que
  • 将上下文管理器的动态可迭代链接到单个 with 语句

    我有一堆想要链接的上下文管理器 第一眼看上去 contextlib nested看起来是一个合适的解决方案 但是 此方法在文档中被标记为已弃用 该文档还指出最新的with声明直接允许这样做 自 2 7 版起已弃用 with 语句现在支持此
  • 查找总和为给定数字的值组合的函数

    这个帖子查找提供的 Sum 值的组合 https stackoverflow com a 20194023 1561176呈现函数subsets with sum 它在数组中查找总和等于给定值的值的组合 但由于这个帖子已经有6年多了 我发这

随机推荐

  • 1.软件开发方法

    软件开发方法 文章目录 软件开发方法 1 瀑布模型 2 增量模型 3 喷泉模型 4 敏捷开发 5 DevOps开发 6 DDD领域开发 7 总结 7 总结 1 瀑布模型 瀑布模型是一种线性 顺序的软件开发方法 以阶段为基础 需求分析 设计
  • pip win上安装gpu版本 pytorch

    检查cuda版本 nvcc V 打开torch previous 版本页面 https pytorch org get started previous versions 选择合适的版本 如 pip install torch 1 13 1
  • C语言指针详解及示例代码

    C语言指针详解及示例代码 指针是C语言中一项重要的概念 它允许我们直接访问和操作内存中的数据 本文将详细介绍C语言中指针的概念 使用方法和示例代码 指针的基本概念 指针是一个变量 它存储了其他变量的内存地址 通过指针 我们可以直接访问和修改
  • 用递归的方法求n!

    用递归的方法求n 在写此函数之前 我们需要知道 函数递归是什么 顾名思义 函数递归 着重在 递归 俩字 对于函数 我想大部分初始者已经不陌生 在这里笔者就不做过多的讲述 在调用一个函数的过程中 又直接或者间接的调用该函数本身 称为函数的递归
  • springboot项目添加lombok日志输出控制台和log文件

    这个配置我也是在网上查找的 但是找不到出处了 首先 在resources下面建立logback spring xml文件 这个logback spring是默认springboot可以扫描到的 不用在yml中配置 也可以自己起名字 要在ap
  • C++ 画热力图

    void get point color float intensity int r int g int b if intensity lt 1 r 0 g 0 b 118 else if intensity lt 2 r 84 g 85
  • 第十四届蓝桥杯软件类 1 期模拟赛填空题及题解

    蓝桥杯还剩仅仅10天 但是本人现在才开始准备啊 不过事已至此只好刷一点题练练手感了 系统地去学算法肯定是来不及啦 题目来源 第十四届蓝桥杯软件类 1 期模拟赛 大学组 填空题3 4 5 填空3 项数 问题描述 小蓝特别喜欢调和级数 S n
  • WebService接口与HTTP接口的联系

    1 WebService有很多协议 为什么HTTP比较流行 WebService是个很重型的规范 它的应用协议是SOAP 简单对象访问协议 它所依赖的下层通信方式不单单是HTTP 也有SOAP over SMTP SOAP over TCP
  • 机器学习之空间滤波器

    目录 空间滤波 原理 平滑滤波 图例 均值平滑滤波器 matlab 代码 中值平滑滤波器 matlab 代码 人脸识别识别率比较 PCA k近邻分类器 锐化滤波 Unsharp Mask 效果图 拉普拉斯 效果图 锐化滤波器 matlab
  • 猿创征文| ‘vue‘ 不是内部或外部命令,也不是可运行的程序 或批处理文件。

    vue 不是内部或外部命令 也不是可运行的程序 或批处理文件 今天在使用vue ui进行搭建项目的时候出现了这个问题 在Visual Studio Code中通过vue ui指令使用脚手架安装项目时 终端报错 vue 不是内部或外部命令 也
  • Facebook数据中心实践分析,OCP主要工作成果介绍

    Facebook数据中心实践分析 OCP主要工作成果介绍 摘要 用讲故事的方式重点介绍了Facebook在数据中心方面的实践 其成立开放计算项目 OCP 以来的主要工作成果 以下为正文 保密本就是数据中心行业的惯例 2014年11月 我独自
  • mw325r已断开服务器无响应,水星mw325r路由器恢复出厂设置之后上不了网怎么办?...

    我把水星mw325r路由器恢复出厂设置之后有点问题了 可以教教我怎么解决吗 这是一个典型的重置路由器没有正确设置的案例 路由器恢复出厂的意思就是跟刚买来的时候一样 没有任何用户自己的配置 所以 正确配置路由器才可以上网 接下来家用路由器网小
  • Python 机器学习实战

    1 机器学习概述 机器学习正在迅速改变我们的世界 作为人工智能的核心 我们几乎每天都会读到机器学习如何改变日常的生活 一些人认为它会带领我们进入一个风格奇异的高科技乌托邦 而另一些人认为我们正迈向一个高科技天启时代 将与窃取我们工作机会的机
  • RabbitMQ消息堆积问题及惰性队列

    一 消息堆积 1 消费者堆积问题 当生产者生产消息的速度超过了消费者处理消息的速度 就会导致消息在队列中进行堆积 一定时间后会造成队列达到存储的上限 那么最开始进入队列的消息可能变成死信 会被丢弃 有关死信以及死信消息的处理问题的详细介绍可
  • LeetCode刷题-6

    数组 88 合并两个有序数组 题目描述 题目样例 Java方法 直接合并后排序 思路及算法 代码 执行结果 复杂度 Java方法 双指针 思路及算法 代码 执行结果 复杂度 Java方法 逆向双指针 思路及算法 代码 执行结果 复杂度 题目
  • 台式机计算机无线开关在哪,电脑无线wifi开关在哪里打开

    电脑无法打开wifi问题有很多 其中物理方面问题就是无线开关根本没打开 怎么可能连得上wifi呢 下面是学习啦小编整理的打开电脑wifi无线开关的方法 供您参考 打开电脑wifi无线开关的方法一 点击右下方图标 选择 所有设置 菜单 然后选
  • C#之按位或‘

    这里不介绍按位或按位与的二进制算法 网上大都说的都是关于int类型二进制的按位与和按位或的用法 这里我们来看看bool类型的用法 具体看代码 static void Main string args int i 0 Console Writ
  • Git操作记录

    版权声明 本文为博主原创文章 转载请注明出处 http blog csdn net shulianghan https blog csdn net han1202012 article details 18812279
  • MongoDB的and和or,嵌入式文档,数组查询

    现在 有一张数据表或者是集合 结构如下 我们现在对集合进行and和or查询 如下 1 隐式and查询 查询年龄大于15 且性别属于男性的数据 db tb find age gt 15 sex male 关键字 gt是大于的意思 结果 2 显
  • 面向对象编程之多态性与鸭子类型

    目录 一 什么是多态 二 多态性 三 abc抽象类模块 四 鸭子类型 六 总结 一 什么是多态 一类事物有多种不同的形态 如 动物有猫 狗 鸡等 二 多态性 所谓多态性指的是不管各对象是什么数据类型就直接使用各对象中统一的方法函数 从一定程