【一】多态

【1】什么是多态

  • 多态指的是一类事物有多种形态

【2】示例

  • 比如动物有多种形态:猫、狗、猪
import abc

class Animal(metaclass=abc.ABCMeta):
@abc.abstractmethod
def talk(self):
pass class People(Animal):
def talk(self):
print('你真帅') class Dog(Animal):
def talk(self):
print('汪汪汪') class Pig(Animal):
def talk(self):
print('哼唧哼唧')
  • 文件有多种形态:文本文件,可执行文件
import abc

# 同一类事物:文件
class File(metaclass=abc.ABCMeta):
@abc.abstractmethod
def click(self):
pass # 文件的形态之一:文本文件
class Text(File):
def click(self):
print('open file') # 文件的形态之二:可执行文件
class ExeFile(File):
def click(self):
print('execute file')

【二】多态性

【1】什么是多态动态绑定(多态性)

  • 多态动态绑定在继承的背景下使用时,有时也称为多态性
  • 多态性是指在不考虑实例类型的情况下使用实例
  • 在面向对象方法中一般是这样表述多态性:
    • 向不同的对象发送同一条消息(!!!obj.func():是调用了obj的方法func,又称为向obj发送了一条消息func)
    • 不同的对象在接收时会产生不同的行为(即方法)。
    • 也就是说,每个对象可以用自己的方式去响应共同的消息。
    • 所谓消息,就是调用函数,不同的行为就是指不同的实现,即执行不同的函数。
  • 比如:老师.下课铃响了(),学生.下课铃响了()
    • 老师执行的是下班操作
    • 学生执行的是放学操作
    • 虽然二者消息一样,但是执行的效果不同

【2】多态性的分类

  • 多态性分为静态多态性和动态多态性

(1)静态多态性

  • 如任何类型都可以用运算符 + 进行运算

(2)动态多态性

import abc

class Animal(metaclass=abc.ABCMeta):
@abc.abstractmethod
def talk(self):
pass class People(Animal):
def talk(self):
print('你真帅') class Dog(Animal):
def talk(self):
print('你真帅') class Dog(Animal):
def talk(self):
print('汪汪汪') class Pig(Animal):
def talk(self):
print('哼唧哼唧') peo = People()
dog = Dog()
pig = Pig() peo.talk()
dog.talk()
pig.talk() def func(obj):
obj.talk()
  • Python中一切皆对象,本身就支持多态性

【3】为什么要用多态性(多态性的好处)

  • 增加了程序的灵活性

    • 以不变应万变,不论对象千变万化,使用者都是同一种形式去调用,如func(animal)
  • 增加了程序额可扩展性

    • 通过继承animal类创建了一个新的类,使用者无需更改自己的代码,还是用func(animal)去调用
  • 这样我们新增了一个形态Cat,由Cat类产生的实例cat1,使用者可以在完全不需要修改自己代码的情况下。

  • 使用和人、狗、猪一样的方式调用cat1的talk方法,即func(cat1)

import abc

# 同一类事物:动物
class Animal(metaclass=abc.ABCMeta):
@abc.abstractmethod
def talk(self):
pass # 属于动物的另外一种形态:猫
class Cat(Animal):
def talk(self):
print('喵喵喵') # 对于使用者来说,自己的代码根本无需改动
def func(animal):
animal.talk() # 实例出一只猫
cat1 = Cat()
# 甚至连调用方式也无需改变,就能调用猫的talk功能
func(cat1)

【三】鸭子类型

【1】什么是鸭子类型 duck-typing

  • 鸭子类型是一种编程风格,决定一个对象是否有正确的接口

    • 关注点在于它的方法或属性
    • 而不是它的类型(如果它看起来像鸭子,像鸭子一样嘎嘎叫,那么它一定是鸭子。)。
  • 通过强调接口而不是特定类型,设计良好的代码通过多态提高了灵活性。
    • 鸭子类型无需使用 type()isinstance() 进行检查(注意,鸭子类型可以用抽象基类来补充)
    • 相反,它通常使用 hasattr() 来检查,或是 EAFP 编程。
  • 但其实我们完全可以不依赖于继承,只需要制造出外观和行为相同对象,同样可以实现不考虑对象类型而使用对象,这正是Python崇尚的“鸭子类型”(duck typing):
    • “如果看起来像、叫声像而且走起路来像鸭子,那么它就是鸭子”。
    • 比起继承的方式,鸭子类型在某种程度上实现了程序的松耦合度
# 二者都像鸭子,因而就可以当鸭子一样去用
class NormalDuck():
def eat(self):
print(f"正常鸭子可以吃饭") def walk(self):
print(f"正常鸭子可以走路") class RockDuck():
def eat(self):
print(f"肉鸭子可以吃饭") def walk(self):
print(f"肉鸭子可以走路")

Python面向对象之多态和鸭子类型的更多相关文章

  1. python基础语法17 面向对象4 多态,抽象类,鸭子类型,绑定方法classmethod与staticmethod,isinstance与issubclass,反射

    多态 1.什么是多态? 多态指的是同一种类型的事物,不同的形态. 2.多态的目的: “多态” 也称之为 “多态性”,目的是为了 在不知道对象具体类型的情况下,统一对象调用方法的规范(比如:名字). 多 ...

  2. day25 面向对象之多态和鸭子类型

    1.封装方法 如何封装:给方法名称前面加上双下划线 # ATM 的取款功能 # 1.插入银行卡 2.输入密码 3.选择取款金额 4.取款 class ATM: def __insert_card(se ...

  3. Python类总结-多态及鸭子类型

    Python天生支持多态. 什么是多态: 一类事务的多种形态. 多态的一个例子 class Alipay(): def pay(self,money): print('用支付宝支付了%s元' % mo ...

  4. python 接口(抽象) 多态,鸭子类型, 多继承原理(mro)

    抽象类与接口类 接口类 继承有两种用途: 一:继承基类的方法,并且做出自己的改变或者扩展(代码重用) 二:声明某个子类兼容于某基类,定义一个接口类Interface,接口类中定义了一些接口名(就是函数 ...

  5. Python面向对象04 /封装、多态、鸭子类型、类的约束、super

    Python面向对象04 /封装.多态.鸭子类型.类的约束.super 目录 Python面向对象04 /封装.多态.鸭子类型.类的约束.super 1. 封装 2. 多态 3. 鸭子类型 4. 类的 ...

  6. python 面向对象专题(四):封装、多态、鸭子类型、类的约束、super

    https://www.cnblogs.com/liubing8/p/11321099.html 目录 Python面向对象04 /封装.多态.鸭子类型.类的约束.super 1. 封装 2. 多态 ...

  7. 第7.3节 Python特色的面向对象设计:协议、多态及鸭子类型

    Python是一种多态语言,其表现特征是:对象方法的调用方只管方法是否可调用,不管对象是什么类型,从而屏蔽不同类型对象之间的差异,写出通用的代码,做出通用的编程,以适应需求的不断变化. 一.    P ...

  8. PythonI/O进阶学习笔记_3.1面向对象编程_python的多态和鸭子类型

    前言: 与第一篇的面向对象内容不同的是,第一篇中的面向对象更多的是与类.对象结合起来的概念粗浅理解,就是在编程历史中诞生的一种思想方法. 这篇的面向对象编程,更多落实到在语言设计实现中,是如何体现面向 ...

  9. 多态 与 鸭子类型 duck duck duck

    # --> ''' 多态 与 鸭子类型 --> 什么是多态 对象的多种状态,父类对象的多种 (子类对象) 状态 --> 什么是鸭子类型: 长的像就是 1.规定有什么属性及什么方法的对 ...

  10. Python面向对象----多态和鸭子类型

    1. C#中多态实现的条件是 继承, 重写以及父类指向子类. 但是在弱类型Python里面, 实现多态的条件就显得很简洁, 只需要在子类中实现父类相同名称的方法即可. 2. 鸭子类型的解释: 若一个类 ...

随机推荐

  1. MeshFilter mesh vs sharedMesh

    MeshFilter有两个属性mesh和sharedMesh,从官方文档和实际使用来说说这两者的区别 MeshFilter文档 Unity的MeshFilter文档:https://docs.unit ...

  2. 手撕Vue-数据驱动界面改变中

    经过上一篇的介绍,已经实现了观察者模式的基本内容,接下来要完成的就是将上一篇的发布订阅模式运用到 Nue 中,实现数据驱动界面改变. 在监听数据变化的章节当中,根据指定的区域和数据去编译渲染界面 这个 ...

  3. BigDecimal详解和精度问题

    JavaGuide :「Java学习+面试指南」一份涵盖大部分 Java 程序员所需要掌握的核心知识. BigDecimal 是大厂 Java 面试常问的一个知识点. <阿里巴巴 Java 开发 ...

  4. 大规模语言LLaVA:多模态GPT-4智能助手,融合语言与视觉,满足用户复杂需求

    大规模语言LLaVA:多模态GPT-4智能助手,融合语言与视觉,满足用户复杂需求 一个面向多模式GPT-4级别能力构建的助手.它结合了自然语言处理和计算机视觉,为用户提供了强大的多模式交互和理解.LL ...

  5. 基于50W携程出行攻略构建事件图谱(含码源):交通工具子图谱、订酒店吃饭事件图谱等

    基于50W携程出行攻略构建事件图谱(含码源):交通工具子图谱.订酒店吃饭事件图谱等 项目构成 本项目由两个部分的组成,具体包括语料的获取以及基于语料的事件挖掘两个部分,具体项目目录包括: news_s ...

  6. 认识3D模型-GLTF文件

    GLTF文件格式 glTF的全称(Graphics Language Transmission Format)图形语言传输格式.是三维场景和模型的标准文件格式. glTF 核心是 JSON 文件,描述 ...

  7. .net 工具箱不可用/怎样初始化vs环境 解决方案

    在开始菜单里面执行的.开始菜单->Microsoft Visual Studio 2005->Visual Studio Tools->Visual Studio 2005 命令提示 ...

  8. Vite4+Typescript+Vue3+Pinia 从零搭建(1) - 项目初始化

    项目代码同步至码云 weiz-vue3-template 前提准备 1. node版本 Node.js版本 >= 12,如果有老项目需要旧版本的,推荐用 nvm 管理node版本. PS C:\ ...

  9. 由反射引出的Java动态代理与静态代理

    写在开头 在<深入剖析Java中的反射,由浅入深,层层剥离!>这篇文章中我们讲反射时,曾提到过Java的动态代理中使用了反射技术,那么好,今天我们要就着反射的索引,来学习一下Java中的代 ...

  10. SpringBoot实现统一异常处理

    目录 前言 实现步骤 定义统一响应对象类 定义业务异常枚举接口和实现 定义业务异常基类 定义全局异常处理切面 测试和验证 总结 前言 近日心血来潮想做一个开源项目,目标是做一款可以适配多端.功能完备的 ...