python天生支持多态

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

当我们定义一个class的时候,我们实际上就定义了一种数据类型,我们定义的数据类型和python自带的数据类型,比如str、list、dict 没什么两样:

In [1]: class Animal:...:     passIn [2]: class Dog(Animal):...:     passIn [3]: a = list()In [4]: b = Animal()In [5]: c = Dog()In [6]: isinstance(a, list)    # a 是 list 类型
Out[6]: TrueIn [7]: isinstance(b, Animal)    # b 是 Animal 类型
Out[7]: TrueIn [8]: isinstance(c, Dog)    # c 是 Dog 类型
Out[8]: TrueIn [9]: isinstance(c, Animal)
Out[9]: True

c 不仅仅是 Dog, c 还是 Animal, 因为 Animal 是 c的父类,因此 c 及时 Dog类型,也是 Animal 类型,但是反过来是不行的。

In [12]: b = Animal()In [13]: isinstance(b, Dog)
Out[13]: False

Dog 可以看成 Animal,但是 Animal 不可以看成 Dog

要理解多态,需要编写一个 run_twice 函数。

class Animal:def run(self):print('Animal is running...')class Dog(Animal):def run(self):print('dog is running...')class Cat(Animal):def run(self):print('cat is running...')def run_twice(animal):animal.run()animal.run()dog = Dog()run_twice(dog)

当我们传入 Animal 的实例时,run_twice() 就打印出:

dog is running...
dog is running...

现在,如果我们再定义一个Tortoise类型,也从Animal派生:

class Animal:def run(self):print('Animal is running...')class Dog(Animal):def run(self):print('dog is running...')class Cat(Animal):def run(self):print('cat is running...')class Tortoise(Animal):def run(self):print('tortoise is running...')def run_twice(animal):animal.run()animal.run()tortoise = Tortoise()run_twice(tortoise)

当我们调用 run_twice()时,传入 Tortoise 的实例:

tortoise is running...
tortoise is running...

你会发现,新增一个Animal的子类,不必对run_twice()做任何修改,实际上,任何依赖Animal作为参数的函数或者方法都可以不加修改地正常运行,原因就在于多态。

对于一个变量,我们只需要知道它是Animal类型,无需确切地知道它的子类型,就可以放心地调用run()方法,而具体调用的run()方法是作用在Animal、Dog、Cat还是Tortoise对象上,由运行时该对象的确切类型决定,

这就是多态真正的威力:调用方只管调用,不管细节,而当我们新增一种Animal的子类时,只要确保run()方法编写正确,不用管原来的代码是如何调用的。这就是著名的“开闭”原则:

  • 对扩展开放:允许新增Animal子类;
  • 对修改封闭:不需要修改依赖Animal类型的run_twice()等函数

静态语言 vs 动态语言

对于静态语言(例如Java)来说,如果需要传入Animal类型,则传入的对象必须是Animal类型或者它的子类,否则,将无法调用run()方法。
对于Python这样的动态语言来说,则不一定需要传入Animal类型。我们只需要保证传入的对象有一个run()方法就可以了:

class Timer:def run(self):print('Start...')def run_twice(animal):animal.run()animal.run()timer = Timer()run_twice(timer)

这就是动态语言的“鸭子类型”,它并不要求严格的继承体系,一个对象只要“看起来像鸭子,走起路来像鸭子”,那么就可以被看做是鸭子。

小结

动态语言的鸭子类型的特点决定了继承不像静态语言那样是必须的。

转载于:https://www.cnblogs.com/hukey/p/9894773.html

[ python ] 多态相关推荐

  1. python 多态 协议详解

    这篇文章主要为大家介绍了python 多态 协议 鸭子类型,具有一定的参考价值,感兴趣的小伙伴们可以参考一下,希望能够给你带来帮助 接口(python 中的协议)的多种不同的实现方式即为多态.多态的作 ...

  2. python多态的概念_Python 多态

    Python 多态 一.多态 概念 允许将父对象设置成和一个或多个的他的子对象相等技术,赋值之后,父对象就可以根据当前赋值给它的子对象的特征以不同的方式运作.简单来说:就是允许将子类型的指针赋值给父类 ...

  3. python 多态app_python 多态实例

    python 多态实例 # coding:utf-8 """ 多态(英语:Polymorphism),是指面向对象程序运行时,相同的消息可能会送给多个不同的类之对象, 而 ...

  4. Java多态 和 Python多态

    Java多态和Python多态 ava中的多态跟Python中的多态是有区别的. java中的多态定义: 多态存在的三个必要条件 一.要有继承: 二.要有重写: 三.父类引用指向子类对象 java 多 ...

  5. Python多态的两种实现形式

    说明:仅供学习使用,请勿用于非法用途,若有侵权,请联系博主删除 作者:zhu6201976 博客:https://blog.csdn.net/zhu6201976 一.Python多态 1.对象多态 ...

  6. 什么是多态,Python多态及用法详解

    什么是多态,Python多态及用法详解 在面向对象程序设计中,除了封装和继承特性外,多态也是一个非常重要的特性,本节就带领大家详细了解什么是多态. 我们都知道,Python 是弱类型语言,其最明显的特 ...

  7. python 多态_Python中的多态

    面向对象的语言有四个特性,抽象.封装.继承和多态.在之前的文章中,给小伙伴们已经讲解了前三个.为什么要把多态放在最后一个讲呢?因为前面的三个特性是多态的基础,了解了前三个,了解多态就很容易啦~ 那么, ...

  8. python多态的例子_Python编程之多态用法实例详解

    本文实例讲述了Python编程之多态用法.分享给大家供大家参考.具体分析如下: 什么是多态?顾名思义,多态就是多种表现形态的意思.它是一种机制.一种能力,而非某个关键字.它在类的继承中得以实现,在类的 ...

  9. python 多态 知乎_Python函数接口的一些设计心得

    4.需要反复使用一组参数的时候,传递一个指针(或者C++的引用)比重新在栈里复制一次开销小一些 5.二进制连接,而且不支持重载,希望通过结构体头部字段(比如Windows下通常有个字段表示结构体大小) ...

  10. python多态_Python面向对象教程之多态

    今天给大家介绍面向对象最后一个重要的特性--多态.如果想温习前两个重要特性(继承和封装),可以点开:<Python面向对象教程之基本概念>.<Python面向对象教程之单继承> ...

最新文章

  1. CSP 202006-2 稀疏向量 python实现(非满分)(待更新)
  2. .net mysql中文乱码解决办法
  3. 乞丐版HTML5播放器
  4. 前端学习(3086):vue+element今日头条管理-请求提交
  5. java面试题7 牛客:关于AWT和Swing说法正确的是?
  6. java cas机制_Java CAS机制详解
  7. python电子英汉词典显示_python网页抓取之英汉字典
  8. python语言print函数_Python 的 print 函数
  9. cad一键标注闭合区域lisp_CAD快捷键大全,你值得学会!
  10. Educational Codeforces Round 58
  11. 2011-寒假 linux 学习笔记
  12. 使用Python防止SQL注入攻击
  13. ecshop首页调用团购信息产品购买人数
  14. MySQL索引失效场景以及解决方案
  15. 开源项目zheng运行环境
  16. This is probably not a problem with npm. There is likely additional logging 报错
  17. 《Web API 的设计与开发》读书笔记
  18. PDF限制编辑怎么解决
  19. ENVE5.3安装与汉化(一次性安装成功附安装包)
  20. Ubuntu安装VNC,配置多用户vnc连接Ubuntu,开机自启vnc命令

热门文章

  1. android 内存溢出检查,Android Handler使用导致内存溢出附带LeakCanary排查
  2. 学习笔记之linux网络属性配置及其命令用法
  3. spring cloud利用feign和sentinel进行内部或外部远程调用
  4. GeoTools计算线与面的交点
  5. VUE项目启动:You may use special comments to disable some warnings
  6. webstorm使用插件 statistic 统计代码
  7. Android开发笔记(五十一)通过Messenger实现进程间通信
  8. java用循环做猜拳_java用循环方式实现和计算机玩猜拳的程序
  9. apimodel 可以重复吗_Web API是否需要有ViewModels层类?
  10. eclipse配置tomcat运行时访问路径不要项目名称