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):

pass

class 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() 方法。

java鸭子类型_Python语言中的“Duck type”,鸭子,类型相关推荐

  1. python语言的三种数字类型_Python语言中的类型之数字类型--Python(10)

    数据从不一样的角度能够用不一样的含义去解释它,如: 10,011,101 对上面这个数据,咱们有以下多种含义去解释它: 1)它是1个二进制数字,或者是1个十进制数字: 2)一段文本: 3)用 , 号分 ...

  2. 决定c++语言中函数的返回值类型的是,全国2009年10月高等教育自学考试C++程序设计试题及部分参考答案...

    全国2009年10月高等教育自学考试 C++程序设计试题 课程代码:04737 一.单项选择题(本大题共20小题,每小题1分,共20分) 在每小题列出的四个备选项中只有一个是符合题目要求的,请将其代码 ...

  3. 在c语言中出现的int错误类型,【揭秘】C语言类型转换时发生了什么?

    原标题:[揭秘]C语言类型转换时发生了什么? ID:技术让梦想更伟大 作者:李肖遥 在C语言中,数据类型指的是用于声明不同类型的变量或函数的一个广泛的系统,我们常用的算术类型包括两种类型:整数类型和浮 ...

  4. C语言中几种报错类型的解决方案

    C语言中几种报错类型的解决方案 声明:本人小白,第一次写博客,由于查报错原因比较困难,为了方便记下自己敲代码遇到的问题而随笔写下,文中有诸多错误,希望路过的大佬能够对我的文章批评指正.我也会不断修改完 ...

  5. java 鸭子类_Python:多态、协议和鸭子类型

    多态 问起面向对象的三大特性,几乎每个人都能对答如流:封装.继承.多态.今天我们就要来说一说 Python 中的多态.所谓多态:就是指一个类实例的相同方法在不同情形有不同表现形式.多态机制使具有不同内 ...

  6. java实现鸭子类型,Golang的interface及duck typing鸭子类型

    Golang的interface及duck typing鸭子类型 "当看到一只鸟走起来像鸭子.游泳起来像鸭子.叫起来也像鸭子,那么这只鸟就可以被称为鸭子." 意思就是: 一个东西究 ...

  7. c语言八大数据基本类型,C语言中基本的数据类型有哪些

    C语言中基本的数据类型有哪些 发布时间:2020-11-26 15:10:13 来源:亿速云 阅读:76 作者:Leah 本篇文章给大家分享的是有关C语言中基本的数据类型有哪些,小编觉得挺实用的,因此 ...

  8. 簇的局部变量中布尔类型_GO语言入门(go的基本类型)

    本文节选自<go入门指南> 如果觉得文章太长,可以直接看末尾的总结. 常量 常量使用关键字 const 定义,用于存储不会改变的数据. 存储在常量中的数据类型只可以是布尔型.数字型(整数型 ...

  9. c 传递流java 生僻字_Java语言中的生僻知识

    最近有一首名叫<生僻字>的流行歌曲火遍大江南北,创作者给佶屈聱牙的生僻字,配上了优美明快的旋律,竟然让歌曲变得琅琅上口.悦耳动听起来,平时不太常见的拒人于千里之外的这些汉字也不再那么陌生, ...

  10. c语言中非法使用void类型_C语言中的数据类型

    为什么需要介绍数据类型 学习语言编程,不用急着写代码,先搞懂基本概念.有了基本概念后,然后再考虑在不同的语言中是如何表达的.不同语言无非就是表达方式不一样而已,万变不离其宗. 每一门语言开始部分中总是 ...

最新文章

  1. 上周我面了个三年 Javaer,这几个问题都没答出来
  2. 姚期智施尧耘获FOCS 2021时间检验奖,MIT华人摘最佳学生论文奖
  3. http statusCode(状态码)
  4. deno学习一 安装试用几个问题解决
  5. servlce与filter的url-pattern介绍
  6. SSH项目中遇到拦截器无法注入服务的问题
  7. juyter显示决策树图形_决策树分析细分市场
  8. c语言两数相加vs,两数相加(C语言)
  9. java播放声音类和一个简单示例
  10. 利息高的网络贷款可以不还吗?
  11. 朋友借我10万并把房产证交给我,写了借条,并在借条上写明了用此房产做抵押,有效吗?
  12. 【EF】EF框架 Code First Fluent API
  13. JVM java虚拟机
  14. SecureCRT下载、安装、激活
  15. 卡特彼勒CAT SIS 售后服务系统3D零件图系统软件 2019年最新版
  16. 你选的低功耗MCU是不是真省电?看后请自测
  17. 微信小程序授权登陆,解密encryptedData出现乱码问题
  18. 京东平台和商家的不同合作模式
  19. 剑指spring源码(三)
  20. 大数据采集方法有哪些

热门文章

  1. swiper、vue-awsome-swiper插件使用
  2. 拼多多怎么查看订单详情|盛天海科技
  3. 图床PICGo工具报错问题
  4. python控制微信app_Appium+python在微信的hybridapp里的坑
  5. 李克秋 加盟天津大学 计算机学院,天津大学
  6. 使用Sklearn学习决策树
  7. CSS3 3d立方体/多棱柱-
  8. 阿里在线字体库超级简单又快捷的使用方法+Dcloud插件使用图标
  9. 图像处理之图像噪声和各种噪声的matlab实现
  10. python,检测代理ip是否有效