Python浅析多态与鸭子类型使用实例

作者:Python热爱者 时间:2023-10-25 00:09:06 

什么多态:同一事物有多种形态

为何要有多态=》多态会带来什么样的特性,多态性

  • 多态性指的是可以在不考虑对象具体类型的情况下而直接使用对象

  • 多态指的是一类事物有多种形态,比如动物有多种形态:猫、狗、猪

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,多态,鸭子类型
0
投稿

猜你喜欢

  • python logging模块的使用详解

    2023-06-08 08:43:34
  • python的mysql数据库建立表与插入数据操作示例

    2024-01-22 22:27:32
  • django静态文件加载的方法

    2022-12-26 13:57:56
  • python输入错误后删除的方法

    2023-07-25 11:55:09
  • DW MX新功能试用:嵌套模板

    2008-02-03 11:35:00
  • python面向对象入门教程之从代码复用开始(一)

    2022-07-17 21:54:13
  • 解析Python编程中的包结构

    2022-02-12 03:40:47
  • 用Dreamweaver 4.0编制会议通知

    2010-10-20 20:06:00
  • NumPy-ndarray 的数据类型用法说明

    2023-07-09 22:01:40
  • C#实现的ACCESS数据库操作类完整实例

    2024-01-20 02:57:36
  • 浅谈Laravel模板实体转义带来的坑

    2024-06-05 09:44:24
  • JavaScript代码着色器

    2010-01-22 15:53:00
  • 这些CSS Selector,你都熟悉吗?

    2008-12-21 16:30:00
  • 浅谈Python的正则表达式

    2022-05-11 00:54:16
  • Python详解复杂CSV文件处理方法

    2021-04-05 11:12:02
  • 详细介绍Scrapy shell的使用教程

    2022-04-18 03:35:39
  • 常用CSS缩写语法总结章

    2009-03-17 13:26:00
  • MYSQL每隔10分钟进行分组统计的实现方法

    2024-01-22 13:56:42
  • 浅谈ThinkPHP的URL重写

    2024-05-13 09:24:20
  • python和c语言哪个更适合初学者

    2022-06-22 08:23:29
  • asp之家 网络编程 m.aspxhome.com