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

我们并不关心对象是什么类型,究竟是不是鸭子,仅仅关心行为。

比方在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'

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

最新文章

  1. 中文字体font-family常用列表
  2. Java + 腾讯企业邮箱 + javamail + SSL 发送邮件
  3. PHP之function_handling 函数
  4. XidianOJ 1096 数的拆分
  5. 安卓开发笔记——深入Activity
  6. shell 流程控制
  7. 火狐无法访问本机IIS部署的网站,弹出:此地址使用了一个通常用于网络浏览以外目的的端口.出于安全原因,Firefox 取消了该请求 的解决办法
  8. WebVR
  9. openGL 初试 绘制三角形 和添加鼠标键盘事件
  10. 黑马程序员-- C语言执行过程及注意点
  11. mybatis 并发问题解决,参考hibernate
  12. HighCharts之2D回归直线的散点
  13. 学号:201621123032 《Java程序设计》第10周学习总结
  14. [BZOJ]1005 明明的烦恼(HNOI2008)
  15. .NET中的各种池
  16. SceneKit做一个旋转的地球效果
  17. LOJ #6303. 水题 (约数 质因数)
  18. 简单尝试Spring Cloud Gateway
  19. gstreamer
  20. 100-days: twelve

热门文章

  1. 网易UI自动化测试工具Airtest中导入air文件中的方法
  2. php 过滤敏感关键词
  3. 【STM32H7教程】第23章 STM32H7的MPU内存保护单元(重要)
  4. maven添加本地jar包的方法
  5. java Queue中 remove/poll, add/offer, element/peek区别
  6. IVVI SK3-02小骨酷派SK3-02 进入第三方 recovery 刷机 ROOT
  7. java反射_01
  8. HDU_1729_sg函数(dfs)
  9. python核心编程中的对象值比较VS对象身份比较(转载)
  10. tomcat 热加载设置