在程序设计中,鸭子类型(英语:duck typing)是动态类型的一种风格。在这种风格中,一个对象有效的语义,不是由继承自特定的类或实现特定的接口,而是由当前方法和属性的集合决定。

这个概念的名字来源于由James Whitcomb Riley提出的鸭子测试,“鸭子测试”可以这样表述:

“当看到一只鸟走起来像鸭子、游泳起来像鸭子、叫起来也像鸭子,那么这只鸟就可以被称为鸭子。”

在鸭子类型中,关注的不是对象的类型本身,而是它是如何使用的。例如,在不使用鸭子类型的语言中,我们可以编写一个函数,它接受一个类型为鸭的对象,并调用它的走和叫方法。在使用鸭子类型的语言中,这样的一个函数可以接受一个任意类型的对象,并调用它的走和叫方法。如果这些需要被调用的方法不存在,那么将引发一个运行时错误。任何拥有这样的正确的走和叫方法的对象都可被函数接受的这种行为引出了以上表述,这种决定类型的方式因此得名。

鸭子类型通常得益于不测试方法和函数中参数的类型,而是依赖文档、清晰的代码和测试来确保正确使用。从静态类型语言转向动态类型语言的用户通常试图添加一些静态的(在运行之前的)类型检查,从而影响了鸭子类型的益处和可伸缩性,并约束了语言的动态特性。

Python代码示例上面这样说可能太空洞了。比如在Python中,有很多file-like的东西,比如StringIO,GzipFile,socket。它们有很多相同的方法,我们把它们当作文件使用。

又比如list.extend()方法中,我们并不关心它的参数是不是list,只要它是可迭代的,所以它的参数可以是list/tuple/dict/字符串/生成器等.

鸭子类型在动态语言中经常使用,非常灵活,使得python不想java那样专门去弄一大堆的设计模式。

下面例子用duck typing来实现多态。

#coding=utf-8

class Duck:

def quack(self):

print "Quaaaaaack!"

class Bird:

def quack(self):

print "bird imitate duck."

class Doge:

def quack(self):

print "doge imitate duck."

def in_the_forest(duck):

duck.quack()

duck = Duck()

bird = Bird()

doge = Doge()

for x in [duck, bird, doge]:

in_the_forest(x)

再举个栗子,

我们来hack输出流。

import sys

sys.stdout = open('stdout.log', 'a') #只要是file-like,不管是什么类型

print 'foo'

sys.stdout = sys.__stdout__ #恢复

print 'bar'

这样就把输出流给写入到文件中去了。

更多详细解释duck typing鸭子类型程序设计与Python的实现相关文章请关注PHP中文网!

本条技术文章来源于互联网,如果无意侵犯您的权益请点击此处反馈版权投诉

python鸭制作类代码_详细解释ducktyping鸭子类型程序设计与Python的实现相关推荐

  1. python鸭制作类代码_Python动态语言与鸭子类型详解

    今天来说说编程语言中的动态类型语言与鸭子类型. 动态语言 维基百科对动态语言的定义: 动态编程语言是一类在运行时可以改变其结构的语言:例如新的函数.对象.甚至代码可以被引进,已有的函数可以被删除或是其 ...

  2. python鸭制作类代码_详解duck typing鸭子类型程序设计与Python的实现示例

    在程序设计中,鸭子类型(英语:duck typing)是动态类型的一种风格.在这种风格中,一个对象有效的语义,不是由继承自特定的类或实现特定的接口,而是由当前方法和属性的集合决定. 这个概念的名字来源 ...

  3. python鸭制作类代码_Python实现多态、协议和鸭子类型的代码详解

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

  4. python鸭制作类代码_python之鸭子类型

    python不支持多态,也不用支持多态,python是一种多态语言,崇尚鸭子类型. 在程序设计中,鸭子类型是动态类型的一种风格,不是由继承特定的类或实现特定的接口,而是当前的方法和属性的集合决定,鸭子 ...

  5. Python面向对象,类,继承,多态及鸭子类型,获取类的类型,方法和属性(类似java的反射)

    1.创建类的代码: #在Java中,所有的最终父类都是Object #在python中也是,一个类没有直接的父类就写入objectclass Animal(object):#在python中init方 ...

  6. python分析人口出生率代码_【源码】国家统计局人口数据采集Python脚本数据汇总 | 州的先生...

    在上一篇文章<"一胎化"35年,Python可视化初探中国人口变化>中,州的先生(微信号:taoist_ling,公众号:zmister2016)通过采集国家统计局&q ...

  7. python血条游戏代码_零基础快速学十二课Python完整游戏代码,使用「格式符%」来处理...

    十二课Python不同数据类型的拼接方式,使用[格式符%]来处理 不过它还没有全部解决:打印出每局结果,三局两胜打印最终战果.这就是版本3.0需要做的事情. 打印战果,三局两胜. 对比2.0版本,在3 ...

  8. python分析人口出生率代码_国家统计局居然也能用的上Python?人口数据Python脚本了解一下?...

    原标题:国家统计局居然也能用的上Python?人口数据Python脚本了解一下? 通过采集国家统计局"国家数据"网站中提供的中国历年人口数据,并对数据进行可视化的探索,发现了一些有 ...

  9. python入门小程序代码_源码精灵游戏小程序,python入门游戏,点开既玩

    沐沐带你发现好游戏! 丑姐儿今天给大家伙儿介绍一款小游戏, 名字叫做源码精灵, 看着应该是一款商业化的小游戏, 不过也是良心制作的了, 很Q萌. 这一款和头脑风暴有一点点儿类似的地方就是答题, 是的莫 ...

最新文章

  1. Linux tail 命令详解
  2. 看漫画就能学SQL,简直太cool了
  3. windows编写linux脚本,Windows PowerShell:共享您的脚本 - 在脚本中编写 Cmdlet | Microsoft Docs...
  4. 显示驱动包含在Linux内核层,驱动程序层(上) - Linux内核--网络栈实现分析_Linux编程_Linux公社-Linux系统门户网站...
  5. 能用钱解决的,绝不要花时间 过来人的11条人生经验
  6. 人工智能 | 人脸识别研究报告(概念篇)
  7. Spark(十二) -- Spark On Yarn Spark as a Service Spark On Tachyon
  8. java 启动redis服务器_docker启动redis并使用java连接
  9. linux spoon.sh闪退,解决Linux Kettle出现闪退问题
  10. 随想录(谈谈软件架构)
  11. Machine Learning - XI. Machine Learning System Design机器学习系统设计(Week 6)系统评估标准
  12. 解决安装软件权限不够的问题
  13. 【台词】严厉的愛Tough Love」(后妈茶话会)
  14. ML之Spearman:Spearman相关系数(斯皮尔曼等级相关系数)的简介、案例应用之详细攻略
  15. html表头固定原理,html Table 表头固定的实现
  16. 【劣等上等】MMD动作+镜头数据下载
  17. (CCTV2视频)中国动画80年
  18. 控制台PHP安装composer,生产线安装composer及php cli配置
  19. spring深入学习(十九) IOC 之 Factory 实例化 bean
  20. Windows命令-解压缩文件-tar

热门文章

  1. asp.net中打印指定控件内容
  2. 设计一个移动应用的本地缓存机制
  3. child pid xxx exit signal Segmentation fault (11)
  4. 一瓦同城-给新人第四天培训
  5. Echange 的发展史
  6. 部署Symantec Antivirus 10.0网络防毒服务器之七
  7. C语言显示相位的程序,【图片】求助大佬用c语言帮忙编写下程序【c程序吧】_百度贴吧...
  8. json.tojsonstring 导致cpu飙高_阿里调试神器立功了!进程导致Kubernetes节点CPU飙高的排查与解决...
  9. Addition Chains(信息学奥赛一本通-T1443)
  10. C++语言基础 —— STL —— 算法