Python-面向对象编程之多态

一、基本概念

  1. 什么是多态?

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

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

    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()
    
  2. 为何要有多态?

    多态会带来什么样的特性 ==》多态性

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

    多态性指的是可以在不用考虑对象具体类型的情况下而直接使用对象,这就需要在设计时,把对象的使用方法统一成一种:例如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_面向对象编程之多态、鸭子类型相关推荐

  1. python学习三-基础语法

    python学习三-基础语法(2019-12-24日晚) 1.源码文件 Python源码文件名通常采用小写的方式,常见的扩展名有: py:基本的源码扩展名. pyw:是另一种源码扩展名,跟py唯一的区 ...

  2. python ui bs_Guibs的Python学习_列表

    Guibs 的 Python学习_列表# 列表# 列表由一系列按特定顺序排列的元素组成, 其中元素和元素之间可以没有任何关系 # 在 Python 中, 用方括号 [] 来表示列表, 并用逗号 , 分 ...

  3. python基础语法及知识总结-Python 学习完基础语法知识后,如何进一步提高?

    ---4.30更新---感谢大家支持,点赞都破两千了.给大家整理出来新的资料,需要的小伙伴来自取: Python练手项目视频如下: Python自学基础知识如下: 以下为原文内容: Python 学习 ...

  4. Python学习入门基础教程(learning Python)--5.6 Python读文件操作高级

    前文5.2节和5.4节分别就Python下读文件操作做了基础性讲述和提升性介绍,但是仍有些问题,比如在5.4节里涉及到一个多次读文件的问题,实际上我们还没有完全阐述完毕,下面这个图片的问题在哪呢? 问 ...

  5. python学习_循环语句

    python学习_循环语句 第1关:斐波那契数列 斐波那契数列(Fibonacci sequence),又称黄金分割数列. 因数学家莱昂纳多·斐波那契(Leonardoda Fibonacci)以兔子 ...

  6. python 学习_第五模块 DMO

    python 学习_第五模块 DMO 1. 节点 <!DOCTYPE html> <html lang="en"> <head><meta ...

  7. C/C++面向对象编程之多态

    C/C++面向对象编程 目录: 1.类型转换 2.为什么引入多态和虚函数 3.编译器如何实现多态和虚函数 4.多态的思想 5.C语言用实现多态的思想 目录: C/C++面向对象编程之封装 C/C++面 ...

  8. Python学习——02-Python基础——【8-面向对象的程序设计】——静态、组合、继承...

    一 面向对象的程序设计的由来 面向对象设计的由来见概述:http://www.cnblogs.com/linhaifeng/articles/6428835.html 二 什么是面向对象的程序设计及为 ...

  9. C语言--面向对象编程之多态

    系列文章目录 C语言–面向对象编程之封装 C语言–面向对象编程之继承 文章目录 系列文章目录 前言 一.多态是什么? 二.C语言实现多态 1.多态基本实现原理 2.一个简单的demo 3.简要分析 三 ...

  10. Python学习入门7:python学习从基础到高手,再到就业

    其实入门Python并不难,难的是选定自己的学习方向. 简单说下Python可以做什么: 后台开发(Django / Flask / Tornado) 科学计算(Numpy / Scipy / Mat ...

最新文章

  1. 2020年春季学期信号与系统课程作业参考答案-第十五次作业
  2. java中javamail收发邮件实现方法
  3. 【嵌入式】Ubuntu20.04执行arm-linux-gc 没有那个文件或目录
  4. django【orm操作】
  5. 如何退出_农民退出的宅基地如何利用?农村宅基地征收如何补偿?
  6. onCreate源码分析
  7. (转)Spring Boot (十四): Spring Boot 整合 Shiro-登录认证和权限管理
  8. 余承东:华为腕上穿戴设备市场份额已达全球第一
  9. Java cache类型_为什么有些Java 类方法中要cache类变量
  10. java 静态方法_自学JAVA每日记录(11)-欢迎指点欢迎共勉
  11. linux系统命令行方式复制文件
  12. 指纹对比软件_杰恩世软件平台钢片AOI检测应用
  13. tps协议和onvif协议_摄像头ONVIF协议,到底啥是ONVIF,又是啥意思?
  14. 凤凰项目:一个IT运维的传奇故事--阅读心得
  15. 数学建模——stata基础操作
  16. Drupal 在Views 中自定义筛选 Filter
  17. Python每日一记179文氏图绘制
  18. 利用keytool工具生成数字证书
  19. 如何高效访问OneDrive个人存储空间?三种方法
  20. [Hadoop基础]-- Hadoop namenode的HA搭建

热门文章

  1. CPI、PPI、PMI
  2. SpringBoot统一返回结果
  3. 开心豆少儿英语好吗,收费怎么样,一年多少钱的学费
  4. JAVA计算机毕业设计博雅楼自习室预约系统Mybatis+系统+数据库+调试部署
  5. 全流程东方时尚C1考试经历
  6. perl和bugzilla
  7. LM75AD温度传感器读写
  8. LateX各种命令符号
  9. iOS开发之--内购、GameCenter、iCloud、Passbook功能开发汇总
  10. linux 删除文件彻底删除文件夹,linux下彻底删除文件