在程序设计中,鸭子类型(英语: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鸭制作类代码_详解duck typing鸭子类型程序设计与Python的实现示例相关推荐

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

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

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

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

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

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

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

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

  5. python评价指标_详解分类评价指标和回归评价指标以及Python代码实现

    这篇文章介绍的内容是详解分类评价指标和回归评价指标以及Python代码实现,有着一定的参考价值,现在分享给大家,有需要的朋友可以参考一下. 1.概念 性能度量(评价)指标,主分为两大类: 1)分类评价 ...

  6. python壁纸高清图片_详解Python静态网页爬取获取高清壁纸

    前言 在设计爬虫项目的时候,首先要在脑内明确人工浏览页面获得图片时的步骤 一般地,我们去网上批量打开壁纸的时候一般操作如下: 1.打开壁纸网页 2.单击壁纸图(打开指定壁纸的页面) 3.选择分辨率(我 ...

  7. python手机壁纸超清_详解Python静态网页爬取获取高清壁纸

    前言 在设计爬虫项目的时候,首先要在脑内明确人工浏览页面获得图片时的步骤 一般地,我们去网上批量打开壁纸的时候一般操作如下: 1.打开壁纸网页 2.单击壁纸图(打开指定壁纸的页面) 3.选择分辨率(我 ...

  8. python中pandas安装视频教程_详解Python中pandas的安装操作说明(傻瓜版)

    很多人来问我pandas的安装(python数据分析里面的必修课) 步骤如下: 安装python的时候,把路径加到系统里,这样,随时可以用pip 路径添加方法: 查找路径: 路径1: 2.例如: 即: ...

  9. python可变参数的实验性_详解Python的三种可变参数

    可变参数 可变参数应该最简单,在C/C++和Java等语言中都有,就是用*号来表示,例如 def testArg(*arg) 你可以传入任意多个元素(包括0)到参数中,在函数内部会自动认为是一个元组或 ...

最新文章

  1. 程序员要学会读源代码
  2. TreeView 跟 Iframe 关联设置的方法。
  3. 微軟 ASP.NET 2.0 的 AJAX 利劍 ~ Atlas Framework
  4. AutoCAD如何输入文字
  5. linux脚本done报错,linux – 如何在shell脚本中处理错误/异常?
  6. MySQL工作笔记-使用rand生成随机数及用随机数填充记录
  7. 树形结构 —— 并查集 —— 基本操作
  8. Q1:spring-boot中Controller路径无法被访问的问题
  9. 一行或多行文本内容溢出显示省略号
  10. layer —— 一个简单的jQuery弹出层插件
  11. python通过类名创建对象_如何在Python中为自动创建的类对象分配名称
  12. 大家一起用gtk编程4(使用GDB调试程序)[zt]
  13. Python解微分方程(验证数学建模第五版火箭发射模型)
  14. TOPSIS法 —— matlab
  15. Unity 粒子特效
  16. win10+Ubuntu20.04双系统安装
  17. php抓取微信图片,PHP使用CURL采集微信图片(公众号)如何绕过防盗链系统?
  18. 服务器开机必须要按f1才能进系统,为什么开机要按f1才能进系统
  19. 【春招实习】贝壳金服电话一面
  20. 图像增强去雾之直方图均衡化/同态滤波/Retinex算法

热门文章

  1. 机械坑(长期更新):接触到的常用标准件,命名规则和商家
  2. java 二叉树的高度_吃透Java集合系列十二:TreeMap
  3. unturned显示在服务器列表,Unturned如何筛选公共服务器
  4. 计算机二级考试python考试大纲_2019年计算机二级Python语言程序设计考试大纲
  5. jas完成编译后提示:HTTP Status 404 - /shop/user_regist.action }其中 和}代表什么
  6. Java 基础篇:多线程基本概念
  7. IT项目管理——作业四
  8. photoscan自动化脚本
  9. LTE-A载波聚合技术(7)---PDCCH monitoring、连接、盲检
  10. DeviceEventEmitter清除监听两种方式区别