什么是鸭子类型(duck typing)
2024-08-31 05:43:18
“当看到一仅仅鸟走起来像鸭子、游泳起来像鸭子、叫起来也像鸭子,那么这仅仅鸟就能够被称为鸭子。”
我们并不关心对象是什么类型,究竟是不是鸭子,仅仅关心行为。
比方在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'
这样就把输出流给写入到文件里去了。
最新文章
- 中文字体font-family常用列表
- Java + 腾讯企业邮箱 + javamail + SSL 发送邮件
- PHP之function_handling 函数
- XidianOJ 1096 数的拆分
- 安卓开发笔记——深入Activity
- shell 流程控制
- 火狐无法访问本机IIS部署的网站,弹出:此地址使用了一个通常用于网络浏览以外目的的端口.出于安全原因,Firefox 取消了该请求 的解决办法
- WebVR
- openGL 初试 绘制三角形 和添加鼠标键盘事件
- 黑马程序员-- C语言执行过程及注意点
- mybatis 并发问题解决,参考hibernate
- HighCharts之2D回归直线的散点
- 学号:201621123032 《Java程序设计》第10周学习总结
- [BZOJ]1005 明明的烦恼(HNOI2008)
- .NET中的各种池
- SceneKit做一个旋转的地球效果
- LOJ #6303. 水题 (约数 质因数)
- 简单尝试Spring Cloud Gateway
- gstreamer
- 100-days: twelve
热门文章
- 网易UI自动化测试工具Airtest中导入air文件中的方法
- php 过滤敏感关键词
- 【STM32H7教程】第23章 STM32H7的MPU内存保护单元(重要)
- maven添加本地jar包的方法
- java Queue中 remove/poll, add/offer, element/peek区别
- IVVI SK3-02小骨酷派SK3-02 进入第三方 recovery 刷机 ROOT
- java反射_01
- HDU_1729_sg函数(dfs)
- python核心编程中的对象值比较VS对象身份比较(转载)
- tomcat 热加载设置