java鸭子类型_Python语言中的“Duck type”,鸭子,类型
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”,鸭子,类型相关推荐
- python语言的三种数字类型_Python语言中的类型之数字类型--Python(10)
数据从不一样的角度能够用不一样的含义去解释它,如: 10,011,101 对上面这个数据,咱们有以下多种含义去解释它: 1)它是1个二进制数字,或者是1个十进制数字: 2)一段文本: 3)用 , 号分 ...
- 决定c++语言中函数的返回值类型的是,全国2009年10月高等教育自学考试C++程序设计试题及部分参考答案...
全国2009年10月高等教育自学考试 C++程序设计试题 课程代码:04737 一.单项选择题(本大题共20小题,每小题1分,共20分) 在每小题列出的四个备选项中只有一个是符合题目要求的,请将其代码 ...
- 在c语言中出现的int错误类型,【揭秘】C语言类型转换时发生了什么?
原标题:[揭秘]C语言类型转换时发生了什么? ID:技术让梦想更伟大 作者:李肖遥 在C语言中,数据类型指的是用于声明不同类型的变量或函数的一个广泛的系统,我们常用的算术类型包括两种类型:整数类型和浮 ...
- C语言中几种报错类型的解决方案
C语言中几种报错类型的解决方案 声明:本人小白,第一次写博客,由于查报错原因比较困难,为了方便记下自己敲代码遇到的问题而随笔写下,文中有诸多错误,希望路过的大佬能够对我的文章批评指正.我也会不断修改完 ...
- java 鸭子类_Python:多态、协议和鸭子类型
多态 问起面向对象的三大特性,几乎每个人都能对答如流:封装.继承.多态.今天我们就要来说一说 Python 中的多态.所谓多态:就是指一个类实例的相同方法在不同情形有不同表现形式.多态机制使具有不同内 ...
- java实现鸭子类型,Golang的interface及duck typing鸭子类型
Golang的interface及duck typing鸭子类型 "当看到一只鸟走起来像鸭子.游泳起来像鸭子.叫起来也像鸭子,那么这只鸟就可以被称为鸭子." 意思就是: 一个东西究 ...
- c语言八大数据基本类型,C语言中基本的数据类型有哪些
C语言中基本的数据类型有哪些 发布时间:2020-11-26 15:10:13 来源:亿速云 阅读:76 作者:Leah 本篇文章给大家分享的是有关C语言中基本的数据类型有哪些,小编觉得挺实用的,因此 ...
- 簇的局部变量中布尔类型_GO语言入门(go的基本类型)
本文节选自<go入门指南> 如果觉得文章太长,可以直接看末尾的总结. 常量 常量使用关键字 const 定义,用于存储不会改变的数据. 存储在常量中的数据类型只可以是布尔型.数字型(整数型 ...
- c 传递流java 生僻字_Java语言中的生僻知识
最近有一首名叫<生僻字>的流行歌曲火遍大江南北,创作者给佶屈聱牙的生僻字,配上了优美明快的旋律,竟然让歌曲变得琅琅上口.悦耳动听起来,平时不太常见的拒人于千里之外的这些汉字也不再那么陌生, ...
- c语言中非法使用void类型_C语言中的数据类型
为什么需要介绍数据类型 学习语言编程,不用急着写代码,先搞懂基本概念.有了基本概念后,然后再考虑在不同的语言中是如何表达的.不同语言无非就是表达方式不一样而已,万变不离其宗. 每一门语言开始部分中总是 ...
最新文章
- 上周我面了个三年 Javaer,这几个问题都没答出来
- 姚期智施尧耘获FOCS 2021时间检验奖,MIT华人摘最佳学生论文奖
- http statusCode(状态码)
- deno学习一 安装试用几个问题解决
- servlce与filter的url-pattern介绍
- SSH项目中遇到拦截器无法注入服务的问题
- juyter显示决策树图形_决策树分析细分市场
- c语言两数相加vs,两数相加(C语言)
- java播放声音类和一个简单示例
- 利息高的网络贷款可以不还吗?
- 朋友借我10万并把房产证交给我,写了借条,并在借条上写明了用此房产做抵押,有效吗?
- 【EF】EF框架 Code First Fluent API
- JVM java虚拟机
- SecureCRT下载、安装、激活
- 卡特彼勒CAT SIS 售后服务系统3D零件图系统软件 2019年最新版
- 你选的低功耗MCU是不是真省电?看后请自测
- 微信小程序授权登陆,解密encryptedData出现乱码问题
- 京东平台和商家的不同合作模式
- 剑指spring源码(三)
- 大数据采集方法有哪些