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

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(使用前将#替换为@)

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

  • 无法“安装”plpython3u - postgresql

    我正在尝试在 postgresql 中使用 python 语言 像这样的事情 create or replace function test a integer returns integer as if a 2 0 return even
  • Python 的键盘中断不会中止 Rust 函数 (PyO3)

    我有一个使用 PyO3 用 Rust 编写的 Python 库 它涉及一些昂贵的计算 单个函数调用最多需要 10 分钟 从 Python 调用时如何中止执行 Ctrl C 好像只有执行结束后才会处理 所以本质上没什么用 最小可重现示例 Ca
  • 将 saxon 与 python 结合使用

    我需要使用 python 处理 XSLT 目前我正在使用仅支持 XSLT 1 的 lxml 现在我需要处理 XSLT 2 有没有办法将 saxon XSLT 处理器与 python 一起使用 有两种可能的方法 设置一个 HTTP 服务 接受
  • OpenCV Python cv2.mixChannels()

    我试图将其从 C 转换为 Python 但它给出了不同的色调结果 In C Transform it to HSV cvtColor src hsv CV BGR2HSV Use only the Hue value hue create
  • 如何在flask中使用g.user全局

    据我了解 Flask 中的 g 变量 它应该为我提供一个全局位置来存储数据 例如登录后保存当前用户 它是否正确 我希望我的导航在登录后在整个网站上显示我的用户名 我的观点包含 from Flask import g among other
  • Flask 会话变量

    我正在用 Flask 编写一个小型网络应用程序 当两个用户 在同一网络下 尝试使用应用程序时 我遇到会话变量问题 这是代码 import os from flask import Flask request render template
  • python 相当于 R 中的 get() (= 使用字符串检索符号的值)

    在 R 中 get s 函数检索名称存储在字符变量 向量 中的符号的值s e g X lt 10 r lt XVI s lt substr r 1 1 X get s 10 取罗马数字的第一个符号r并将其转换为其等效整数 尽管花了一些时间翻
  • 如何从网页中嵌入的 Tableau 图表中抓取工具提示值

    我试图弄清楚是否有一种方法以及如何使用 python 从网页中的 Tableau 嵌入图形中抓取工具提示值 以下是当用户将鼠标悬停在条形上时带有工具提示的图表示例 我从要从中抓取的原始网页中获取了此网址 https covid19 colo
  • 是否可以忽略一行的pyright检查?

    我需要忽略一行的pyright 检查 有什么特别的评论吗 def create slog group SLogGroup data Optional dict None SLog insert one SLog group group da
  • 使用 Tkinter 显示 numpy 数组中的图像

    我对 Python 缺乏经验 第一次使用 Tkinter 制作一个 UI 显示我的数字分类程序与 mnist 数据集的结果 当图像来自 numpy 数组而不是我的 PC 上的文件路径时 我有一个关于在 Tkinter 中显示图像的问题 我为
  • Python 函数可以从作用域之外赋予新属性吗?

    我不知道你可以这样做 def tom print tom s locals locals def dick z print z name z name z guest Harry print z guest z guest print di
  • Flask如何获取请求的HTTP_ORIGIN

    我想用我自己设置的 Access Control Allow Origin 标头做出响应 而弄清楚请求中的 HTTP ORIGIN 参数在哪里似乎很混乱 我在用着烧瓶 0 10 1 以及HTTP ORIGIN似乎是这个的特点之一object
  • Python 的“zip”内置函数的 Ruby 等价物是什么?

    Ruby 是否有与 Python 内置函数等效的东西zip功能 如果不是 做同样事情的简洁方法是什么 一些背景信息 当我试图找到一种干净的方法来进行涉及两个数组的检查时 出现了这个问题 如果我有zip 我可以写这样的东西 zip a b a
  • Pygame:有没有简单的方法可以找到按下的任何字母数字的字母/数字?

    我目前正在开发的游戏需要让人们以自己的名义在高分板上计时 我对如何处理按键有点熟悉 但我只处理过寻找特定的按键 有没有一种简单的方法可以按下任意键的字母 而不必执行以下操作 for event in pygame event get if
  • python获取上传/下载速度

    我想在我的计算机上监控上传和下载速度 一个名为 conky 的程序已经在 conky conf 中执行了以下操作 Connection quality alignr wireless link qual perc wlan0 downspe
  • 将图像分割成多个网格

    我使用下面的代码将图像分割成网格的 20 个相等的部分 import cv2 im cv2 imread apple jpg im cv2 resize im 1000 500 imgwidth im shape 0 imgheight i
  • Conda SafetyError:文件大小不正确

    使用创建 Conda 环境时conda create n env name python 3 6 我收到以下警告 Preparing transaction done Verifying transaction SafetyError Th
  • 如何计算 pandas 数据帧上的连续有序值

    我试图从给定的数据帧中获取连续 0 值的最大计数 其中包含来自 pandas 数据帧的 id date value 列 如下所示 id date value 354 2019 03 01 0 354 2019 03 02 0 354 201
  • 在 Qt 中自动调整标签文本大小 - 奇怪的行为

    在 Qt 中 我有一个复合小部件 它由排列在 QBoxLayouts 内的多个 QLabels 组成 当小部件调整大小时 我希望标签文本缩放以填充标签区域 并且我已经在 resizeEvent 中实现了文本大小的调整 这可行 但似乎发生了某
  • NotImplementedError:无法将符号张量 (lstm_2/strided_slice:0) 转换为 numpy 数组。时间

    张量流版本 2 3 1 numpy 版本 1 20 在代码下面 define model model Sequential model add LSTM 50 activation relu input shape n steps n fe

随机推荐

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