Python 语言中的 “鸭子类型”

  • 继承
  • 多态
  • 鸭子类型

不要检查它是不是鸭子、它的叫声像不像鸭子、它的走路姿势像不像鸭子,等等。具体检查什么取决于你想使用语言的哪些行为。(comp.lang.python,2000年7月26日)

——Alex Martelli

鸭子类型(duck typing)
多态的一种形式,在这种形式中,不管对象属于哪个类,也不管声明的具体接口是什么,只要对象实现了相应的方法,函数就可以在对象上执行操作。

提到 “鸭子类型”,就要先讲讲面向对象编程语言中的继承和多态。

继承

首先创建一个 Animal() 父类,父类继承自 object,object 是所有类都会继承的类:

class Animal(object):def run(self):print("The animal is running...")

然后创建两个子类,继承自 Animal():

class Dog(Animal):passclass Cat(Animal):pass

继承的意思就是拥有所有父类的特性。这也是继承的好处,实现了代码复用。所以,Dog() 和 Cat() 均有了 run() 方法:

dog = Dog()
dog.run()cat = Cat()
cat.run()
--------------
The animal is running...
The animal is running...

多态

继承也允许我们对代码进行一些改进,使其符合实际:

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

运行结果如下:

dog = Dog()
dog.run()cat = Cat()
cat.run()
--------------
The dog is running...
The cat is running...

可以看到子类的 run() 方法覆盖了父类的 run()方法。该运行结果体现的就是多态。简单来说,多态就是在子类中覆写父类的方法。这样做的好处是**同样名称的方法在不同的子类中会有不同的行为。**比方说,动物里面包含很多不同种类的动物,如:猫,狗,猪等等,但是它们有相同的特性就是跑,我们可以使用相同的方法来访问它们。

鸭子类型

在程序设计中,鸭子类型(英语:duck typing)是动态类型的一种风格。在这种风格中,一个对象有效的语义,不是由继承自特定的类或实现特定的接口,而是由"当前方法"方法 (计算机科学)")和属性的集合"决定。这个概念的名字来源于由James Whitcomb Riley提出的鸭子测试,“鸭子测试”可以这样表述:“当看到一只鸟走起来像鸭子、游泳起来像鸭子、叫起来也像鸭子,那么这只鸟就可以被称为鸭子。” 在鸭子类型中,关注点在于对象的行为,能作什么;而不是关注对象所属的类型。-- 摘自鸭子类型的维基百科

首先我们先看看下面的代码:

class Animal(object):def run(self):print("The animal is running...")class Dog(Animal):def run(self):print('The dog is running...')class Cat(Animal):def run(self):print('The cat is running...')def makeRun(animalType):animalType.run()dog = Dog()
cat = Cat()
makeRun(dog)
makeRun(cat)

输出结果为:

The dog is running...
The cat is running...

我们可以使用一个函数 makeRun() 来访问不同 Animal 子类中的相同方法。但其实对于上面的 makeRun() 函数来说,传入的参数并不一定需要是 Animal 类型的,只需要保证传入的对象有一个 run() 方法即可,如下面代码所示。这就是动态语言的“鸭子类型”,它并不要求严格的继承体系,一个对象只要“看起来像鸭子,走起路来像鸭子”,那它就可以被看做是鸭子。

class Person(object):def run(self):print("The person is running...")person = Person()
makeRun(person)
----------------------------
The person is running...

而在静态语言中,如 Java ,如果需要传入 Animal 类型,则传入的对象就必须是 Animal 类型或者它的子类,否则,将无法调用 run() 方法。

Python 语言中的 “鸭子类型”相关推荐

  1. 最简洁的解释动态语言中的鸭子类型和闭包

    常见定义 闭包 是拥有独立变量(在封闭空间中定义的可以在本地环境中使用的变量)的函数 程序语言中的闭包(closure)概念不是由JavaScript最先提出的,从smalltalk开始,闭包就成了编 ...

  2. python语言中、复数类型中实数部分_python学习03.02:Python数值类型(整形、浮点型和复数)及其用法...

    实际开发中,我们经常需要使用数字记录游戏中用户的得分.游戏中角色的生命值.伤害值等信息,Python 语言提供了数值类型用于保存这些数值. 需要注意的是,Python 中这些数值类型都是不可改变的,也 ...

  3. python类型-python语言中的数据类型有哪些

    Python基本数据类型一般分为:数字.字符串.列表.元组.字典.集合这六种基本数据类型. 其中数字又包含整型(整型又包括标准整型.长整型(Python2.7及之前版本有)).浮点型.复数类型.布尔型 ...

  4. 属于python语言中合法的二进制整数是_以下选项属于 Python 整数类型的是( )

    [单选题]3*1**3 表达式输出结果为________ [多选题]以下的布尔代数运算正确的是( ) [单选题]下列________不是Python的数据类型. [单选题]下列不是Python语言关键 ...

  5. python语言中整型对应的英文是什么-12.Python数值类型(整形、浮点型和复数)及其用法...

    实际开发中,我们经常需要使用数字记录游戏中用户的得分.游戏中角色的生命值.伤害值等信息,Python 语言提供了数值类型用于保存这些数值. 需要注意的是,Python 中这些数值类型都是不可改变的,也 ...

  6. python中的鸭子类型

    浅层理解 走路像鸭子,说话像鸭子,它就是鸭子 深层理解 指的是面向对中,子类不需要显示的继承某个类,只要有某个的方法和属性,那我就属于这个类 编程语言中的鸭子类型说明 假设有个鸭子类Duck类,有两个 ...

  7. duck typing java_编程语言中的鸭子类型 Duck Typing

    来源 | https://segmentfault.com/a/1190000019607240 1.什么是鸭子类型(duck typing) 百度百科是这样解释的: 这是程序设计中的一种类型推断风格 ...

  8. 编程语言中的鸭子类型 Duck Typing

    来源 | https://segmentfault.com/a/1190000019607240 1.什么是鸭子类型(duck typing) 百度百科是这样解释的: 这是程序设计中的一种类型推断风格 ...

  9. 【Python】浅谈 鸭子类型 (Duck Typing)

    目录 一.来源 二.说明 三.举例 四.不足 一.来源 在程序设计中,鸭子类型 (duck typing) 是动态类型的一种风格.在此风格中,一个对象有效的语义,不是由继承自特定的类或实现特定的接口, ...

最新文章

  1. graphpad做折线图坐标轴数字_pandas做数据可视化具体操作,快来看看吧
  2. 条件随机场CRF HMM,MEMM的比较
  3. 宽依赖和窄依赖_Spark术语解释及宽窄依赖执行原理,代码分析
  4. 模意义下的FFT算法
  5. Spring Boot应用程序的“本地服务”
  6. oracle带时间查询语句,请教oracle按时间分组查询语句的写法
  7. php 实现贪吃蛇游戏,C++实现简单贪吃蛇游戏
  8. docker镜像创建与优化
  9. DRAM与SRAM的比较
  10. 谷歌(Google Chrome)插件安装
  11. linux内核 eql.c,Linux Kernel EQL_GETMASTRCFG请求内核信息泄露漏洞
  12. java 栈_Java实现单链表、栈、队列三种数据结构
  13. 图书管理系统(Java实现,十个数据表,含源码、ER图,超详细报告解释,2020.7.11更新)...
  14. figtree需要在JAVA下运行吗,科学网—Inno setup 制作安装文件以编译FigTree为例 - 张金龙的博文...
  15. 咱用AppDesigner开发复现了一款我国古老的桌游 —【升官图】
  16. Cadence制作flash焊盘时找不到
  17. 无线上外网,有线上内网的方式
  18. matlab画极坐标心形线,matlab画心形线
  19. 2017cad光标大小怎么调_cad光标设置,小编教你CAD的十字光标如何设置大小
  20. java ebcdic编码转换_EBCDIC编码转换为ASCII编码

热门文章

  1. 【Vegas2010】1月24日-钢琴教材从零起步的进阶选取
  2. js动态设置select中option选中
  3. 《红海行动》之黑天鹅事件
  4. android tmp目录权限不够,android - 使用root用户安装APK,处理“ / data / local / tmp /”文件夹的新限制 - 堆栈内存溢出...
  5. 招商银行信用卡中心实习生招聘(第二批)题解
  6. 有机晶体数据库_福利干货:晶体学数据库大盘点
  7. 同程旅游缓存系统(凤凰)打造 Redis 时代的完美平台实践
  8. hdu 4510(模拟)
  9. c语言表示整型变量,在表示 C语言的整型变量时,表示“无符号长整型”的符号是( )。...
  10. Typora+阿里云OSS(将图片上传到阿里云服务器上)