Python浅析多态与鸭子类型使用实例
作者:Python热爱者 发布时间:2023-10-25 00:09:06
标签:Python,多态,鸭子类型
什么多态:同一事物有多种形态
为何要有多态=》多态会带来什么样的特性,多态性
多态性指的是可以在不考虑对象具体类型的情况下而直接使用对象
多态指的是一类事物有多种形态,比如动物有多种形态:猫、狗、猪
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()
多态性指的是可以在不用考虑对象具体类型的情况下而直接使用对象,这就需要在设计时,把对象的使用方法统一成一种:例如cat、dog、pig都是动物,但凡是动物肯定有talk方法,于是我们可以不用考虑它们三者的具体是什么类型的动物,而直接使用
>>> cat.talk()
喵喵喵
>>> dog.talk()
汪汪汪
>>> pig.talk()
哼哼哼
综上我们得知,多态性的本质在于不同的类中定义有相同的方法名,这样我们就可以不考虑类而统一用一种方式去使用对象,可以通过在父类引入抽象类的概念来硬性限制子类必须有某些方法名
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,无法实例化
但其实我们完全可以不依赖于继承,只需要制造出外观和行为相同对象,同样可以实现不考虑对象类型而使用对象,这正是Python崇尚的“鸭子类型”(duck typing):“如果看起来像、叫声像而且走起路来像鸭子,那么它就是鸭子”。
比起继承的方式,鸭子类型在某种程度上实现了程序的松耦合度,如下
#二者看起来都像文件,因而就可以当文件一样去用,然而它们并没有直接的关系
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
来源:https://blog.csdn.net/qdPython/article/details/126993577


猜你喜欢
- 本文实例讲述了Python socket连接中的粘包、精确传输问题。分享给大家供大家参考,具体如下:粘包:发生原因:当调用send的时候,数
- 最近拾回Django学习,实例练习中遇到了对多维字典类型数据的遍历操作问题,Google查询没有相关资料…毕竟是新手,到自己动手时发现并非想
- 目录一、索引下推优化的原理二、索引下推的具体实践1、没有使用ICP2、使用ICP三、索引下推使用条件索引下推(Index Condition
- 下面是我写的NumericStepper:谢谢 果果 和 Rimifon , 我对代码进行了完善, 支持自适应小数位数:
- 本文实例讲述了Yii框架学习笔记之应用组件操作。分享给大家供大家参考,具体如下:所有的组件都应声明在config/web.php//组件声明
- 通过一个简单的实例,来让大家了解一下golang flag包的一个简单的用法package mainimport ( "
- 本文实例讲述了js实现适用于素材网站的黑色多级菜单导航条效果。分享给大家供大家参考。具体如下:这是一款适用于素材网站的黑色多级菜单导航条,无
- 1、python教程基于 python3.10 的持续解读,旨在快速回忆加深理解,节约自己的时间成本1.1 概述python 是一门易于学习
- QQ登录Banner增加了剧情的概念之后,已经推出了春节和情人节两期。这之后设想能围绕Banner做的更加丰富,对传统文化的体现也能更为深入
- 本文给大家分享了好几种复制表结构、表数据的示例介绍,具体详情请看下文吧。1、复制表结构及数据到新表CREATE TABLE 新表SELECT
- 目的两年前曾为了租房做过一个找房机器人 「爬取豆瓣租房并定时推送到微信」,维护一段时间后就荒废了。当时因为代码比较简单一直没开源,现在想想说
- 这篇文章主要介绍了PYTHON发送邮件YAGMAIL的简单实现解析,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价
- 今天给大家分享Listary v5.00.2843 2022年6月9日亲测可用注册码 ,是一款最新的激活码,有需要的朋友前来查看。Lista
- 1.资源下载官网下载地址:https://dev.mysql.com/downloads/mysql/2.软件解压 2.1选择位置
- 细心的人都会发现GitHub个人主页有一个记录每天贡献次数的面板,我暂且称之为贡献面板。就像下图那个样子。只要当天在GitHub有提交记录,
- 本文实例为大家分享了vue简单的图书管理具体代码,供大家参考,具体内容如下<table class="table table
- 前言本节我们继续SQL之旅,本节我们如题来讲讲一些基本知识以及需要注意的地方,若有不妥之处,还望指出,简短的内容,深入的理解。数据库架构和对
- 前言在vue项目中我们经常使用到 v-show ,v-if,v-for等内置的指令,除此之外vue还提供了非常方便的自定义指令,供我们对普通
- 准备工作(接上篇文章的示例也可以):1. 在index.js文件中引入任一js文件import sum from './sum
- 牛顿法求平方根原理计算机常用循环来计算F的平方根.从某个猜测的x值开始,根据x^2与F的近似度来调整x,产生一个更好的猜测:x -= (x