Python学习_基础_29_面向对象编程之多态、鸭子类型
Python-面向对象编程之多态
一、基本概念
什么是多态?
多态:同一事物有多种形态
比如动物有多种形态:猫、狗、猪
class Animal: # 同一类事物:动物def talk(self):print('动物电码,滴滴哒哒')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 = Cat() dog = Dog() pig = Pig()cat.talk() dog.talk() pig.talk()
多态:指为不同数据类型的实体提供统一的接口。——百度百科:多态
更进一步,我们可以定义一个统一的接口来使用:
def animal_talk(animal):animal.talk()cat = Cat() dog = Dog() pig = Pig()animal_talk(cat) animal_talk(dog) animal_talk(pig)
其实我们一直都在使用多态的概念:
比如字符串、列表、字典等对象都具有
.__len__()
方法print('hello'.__len__()) print([1, 2, 3].__len__()) print({'a': 1, 'b': 2}.__len__())
更进一步,可以定义一个统一的接口来使用:
def my_len(val):return val.__len__()print(my_len('hello')) print(my_len([1, 2, 3])) print(my_len({'a': 1, 'b': 2}))
其实这就是:
print(len('hello')) print(len([1, 2, 3])) print(len({'a': 1, 'b': 2}))
个人对继承类多态的理解:子类们继承父类,再统一子类方法接口,实现拿来即用,不再通过调用使用。
二、鸭子类型
python中更为推崇的多态是鸭子类型
在程序设计中,鸭子类型(英语:duck typing)是动态类型的一种风格。在这种风格中,一个对象有效的语义,不是由继承自特定的类或实现特定的接口,而是由"当前方法和属性的集合"决定。这个概念的名字来源于由[James Whitcomb Riley](https://baike.baidu.com/item/James Whitcomb Riley)提出的鸭子测试,“鸭子测试”可以这样表述:
“当看到一只鸟走起来像鸭子、游泳起来像鸭子、叫起来也像鸭子,那么这只鸟就可以被称为鸭子。”
——百度百科:鸭子类型
即我们并不关心对象是什么类型,究竟是不是鸭子,仅仅关心行为。比如迭代器,任何实现了__iter__
和__next__
方法的对象都可称之为迭代器,但对象本身是什么类型不受限制,可以自定义为任何类。
个人对鸭子类多态的理解:
丧心病狂到拿方法作为参照来把一群类统一接口,比如汽车能跑,人也能跑,而且都是在地上跑,所以定义一个统一的“跑”接口,不管是人还是车扔进去都是能跑。换言之,按照人的思维来对类进行划分、统一接口,前提是这类对象有一种相同物理(生物)特征。比如动物分猫狗猪,这种分类思维固化在我们的脑子里。现在这种鸭子类型,相当于把所有具有相同“方法(功能、行为)”的对象打包出一个共同接口,而并不关心相同行为后面不同的对象是什么牛鬼蛇神。
# 超人 飞机 鸟
# 按照鸭子类型思想:
class 超人:def fly(self):print('飞飞飞')class 飞机:def fly(self):print('飞飞飞')class 鸟:def fly(self):print('飞飞飞')def fly(obj):obj.fly()
# 超人 飞机 鸟
# 按照常规思想:
class 动物:def fly(self):print('飞飞飞')class 超人(动物):passclass 鸟(动物):passclass 飞机:def fly(self):print('飞飞飞')obj = 超人()def fly(obj):obj.fly()fly(obj)
嗯,还是很玄乎。
Python学习_基础_29_面向对象编程之多态、鸭子类型相关推荐
- python学习三-基础语法
python学习三-基础语法(2019-12-24日晚) 1.源码文件 Python源码文件名通常采用小写的方式,常见的扩展名有: py:基本的源码扩展名. pyw:是另一种源码扩展名,跟py唯一的区 ...
- python ui bs_Guibs的Python学习_列表
Guibs 的 Python学习_列表# 列表# 列表由一系列按特定顺序排列的元素组成, 其中元素和元素之间可以没有任何关系 # 在 Python 中, 用方括号 [] 来表示列表, 并用逗号 , 分 ...
- python基础语法及知识总结-Python 学习完基础语法知识后,如何进一步提高?
---4.30更新---感谢大家支持,点赞都破两千了.给大家整理出来新的资料,需要的小伙伴来自取: Python练手项目视频如下: Python自学基础知识如下: 以下为原文内容: Python 学习 ...
- Python学习入门基础教程(learning Python)--5.6 Python读文件操作高级
前文5.2节和5.4节分别就Python下读文件操作做了基础性讲述和提升性介绍,但是仍有些问题,比如在5.4节里涉及到一个多次读文件的问题,实际上我们还没有完全阐述完毕,下面这个图片的问题在哪呢? 问 ...
- python学习_循环语句
python学习_循环语句 第1关:斐波那契数列 斐波那契数列(Fibonacci sequence),又称黄金分割数列. 因数学家莱昂纳多·斐波那契(Leonardoda Fibonacci)以兔子 ...
- python 学习_第五模块 DMO
python 学习_第五模块 DMO 1. 节点 <!DOCTYPE html> <html lang="en"> <head><meta ...
- C/C++面向对象编程之多态
C/C++面向对象编程 目录: 1.类型转换 2.为什么引入多态和虚函数 3.编译器如何实现多态和虚函数 4.多态的思想 5.C语言用实现多态的思想 目录: C/C++面向对象编程之封装 C/C++面 ...
- Python学习——02-Python基础——【8-面向对象的程序设计】——静态、组合、继承...
一 面向对象的程序设计的由来 面向对象设计的由来见概述:http://www.cnblogs.com/linhaifeng/articles/6428835.html 二 什么是面向对象的程序设计及为 ...
- C语言--面向对象编程之多态
系列文章目录 C语言–面向对象编程之封装 C语言–面向对象编程之继承 文章目录 系列文章目录 前言 一.多态是什么? 二.C语言实现多态 1.多态基本实现原理 2.一个简单的demo 3.简要分析 三 ...
- Python学习入门7:python学习从基础到高手,再到就业
其实入门Python并不难,难的是选定自己的学习方向. 简单说下Python可以做什么: 后台开发(Django / Flask / Tornado) 科学计算(Numpy / Scipy / Mat ...
最新文章
- Random随机数相关工具类
- nodejs --inspect-brk结合Chrome开发者工具的调试
- 主题:的中间层框架 第一节
- 旋转函数_【视频课】:一次函数拓展应用(图象的平移、旋转、轴对称及5种解题方法)...
- 警惕cocos2d-x Win32下资源命名大小写
- Activiti 手工任务(manualTask)
- 零基础学python pdf-Python pdf(零基础入门学习Python)V1.0 最新版
- Entity Framework 实践系列 —— 搞好关系 - 单相思(单向一对一,one-to-one)
- IOS 多个UIImageView 加载高清大图时内存管理
- Rust : 高富帅的match
- 九月英语--不同以往的感觉
- DELL服务器自动开机设置
- 2021 Java后端+大数据暑期实习大厂面经
- 如何解决打开浏览器跳转MSN中国页面
- ARM调试原理【调试接口框图】【SWD时序】【SWD主机】
- H710 RAID卡的直通
- GB 9706.1-2020和GB9706.1-2007对照表
- 【PM】从产品经理的角度探索游戏产品
- 技嘉z97 服务器系统,BIOS界面再升级:Startup导航简单好用_技嘉 G1.Sniper Z97_主板评测-中关村在线...
- IRIS 2021 技术文档 First Look 12--技术概要:.NET Object Persistence with XEP
热门文章
- 8个成语接龙首尾相连_成语接龙该怎么接?每组开头有一个成语,要接龙,每一个词的末尾都是下一个词的开头,从 来日方长 到 取之不尽,中间要填8个...
- Java常用日志框架介绍(转载)
- Sketch for mac|矢量绘图设计
- win10任务栏假死问题
- 域名注册和抢注等域名投资知识
- mysql 生日排序 查询生日由近到远 按照生日排序
- vcpkg: bootstrap-vcpkg.bat下载失败问题
- 【转载】vue项目部署到阿里云上详解
- Spring Boot学习笔记
- 16 Three.js 游戏操作案例