详解duck typing鸭子类型程序设计与Python的实现示例


Posted in Python onJune 03, 2016

在程序设计中,鸭子类型(英语: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'

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

Python 相关文章推荐
Python下载懒人图库JavaScript特效
May 28 Python
TF-IDF与余弦相似性的应用(一) 自动提取关键词
Dec 21 Python
利用TensorFlow训练简单的二分类神经网络模型的方法
Mar 05 Python
Python实现的计算马氏距离算法示例
Apr 03 Python
python判断计算机是否有网络连接的实例
Dec 15 Python
Python实现将字符串的首字母变为大写,其余都变为小写的方法
Jun 11 Python
Keras使用tensorboard显示训练过程的实例
Feb 15 Python
python如何绘制疫情图
Sep 16 Python
详解python百行有效代码实现汉诺塔小游戏(简约版)
Oct 30 Python
Python用Jira库来操作Jira
Dec 28 Python
用python批量解压带密码的压缩包
May 31 Python
Python 文字识别
May 11 Python
详解字典树Trie结构及其Python代码实现
Jun 03 #Python
Python中利用Scipy包的SIFT方法进行图片识别的实例教程
Jun 03 #Python
Python中的descriptor描述器简明使用指南
Jun 02 #Python
Python黑魔法Descriptor描述符的实例解析
Jun 02 #Python
深入理解Python变量与常量
Jun 02 #Python
Python中的Descriptor描述符学习教程
Jun 02 #Python
从源码解析Python的Flask框架中request对象的用法
Jun 02 #Python
You might like
改变Apache端口等配置修改方法
2008/06/05 PHP
php设计模式之中介者模式分析【星际争霸游戏案例】
2020/03/23 PHP
JavaScript入门教程 Cookies
2009/01/31 Javascript
dwr spring的集成实现代码
2009/03/22 Javascript
给jQuery方法添加回调函数一款插件的应用
2013/01/21 Javascript
JS字符串处理实例代码
2013/08/05 Javascript
深入理解JavaScript系列(47):对象创建模式(上篇)
2015/03/04 Javascript
JavaScript模拟实现键盘打字效果
2015/06/29 Javascript
强大的JavaScript响应式图表Chartist.js的使用
2017/09/13 Javascript
解决JQuery全选/反选第二次失效的问题
2017/10/11 jQuery
微信小程序实时聊天WebSocket
2018/07/05 Javascript
在vue项目中,将juery设置为全局变量的方法
2018/09/25 Javascript
vue+iview 兼容IE11浏览器的实现方法
2019/01/07 Javascript
在NPM发布自己造的轮子的方法步骤
2019/03/09 Javascript
jQuery事件委托代码实践详解
2019/06/21 jQuery
jquery 插件重新绑定的处理方法分析
2019/11/23 jQuery
python基础教程之基本数据类型和变量声明介绍
2014/08/29 Python
Python实现把utf-8格式的文件转换成gbk格式的文件
2015/01/22 Python
Python读取Json字典写入Excel表格的方法
2018/01/03 Python
VSCode下好用的Python插件及配置
2018/04/06 Python
Python设计模式之状态模式原理与用法详解
2019/01/15 Python
详解Python的循环结构知识点
2019/05/20 Python
将labelme格式数据转化为标准的coco数据集格式方式
2020/02/17 Python
matplotlib 范围选区(SpanSelector)的使用
2021/02/24 Python
HTML5各种头部meta标签的功能(推荐)
2017/03/13 HTML / CSS
车间操作工岗位职责
2013/12/19 职场文书
市优秀教师事迹材料
2014/02/05 职场文书
节约用水倡议书
2014/04/16 职场文书
大队委竞选演讲稿
2014/04/28 职场文书
公司租车协议书
2015/01/29 职场文书
工作证明书
2015/06/15 职场文书
关于食品安全的演讲稿范文(三篇)
2019/10/21 职场文书
SQL Server数据定义——模式与基本表操作
2021/04/05 SQL Server
Sql-Server数据库单表查询 4.3实验课
2021/04/05 SQL Server
解决Mysql报错 Table 'mysql.user' doesn't exist
2022/05/06 MySQL
Go语言测试库testify使用学习
2022/07/23 Golang