在学习Python的时候发现了鸭子类型这个术语,听起来好像很有意思一样,所以把它记下来。

鸭子类型的核心概念在于一个对象的有效语义,不是继承自特定的类或者实现特定的方法,而是

由当前的属性和方法集合决定的。听起来依旧很迷茫,简单的说:

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

在鸭子类型中,关注的不是对象的类型本身,而是它是如何使用的。

实际的例子1,将前两个参数相加后和第三个参数相乘:

1 def add_then_multiplication(a, b, c):
2     return (a + b) * c
3
4 print add_then_multiplication(1, 2, 3)
5 print add_then_multiplication([1, 2, 3], [4, 5, 6], 2)
6 print add_then_multiplication('hello', 'world', 9)

只要参数之间支持+和*运算,就在不使用继承的情况下实现多态。

例子2,鸭子和人:

 1 class Duck:
 2     def quack(self):
 3         print "Quaaaaack..."
 4     def feathers(self):
 5         print "The Duck has feathers."
 6
 7 class Person:
 8     def quack(self):
 9         print "Person is not a duck"
10     def feathers(self):
11         print "The person takes a feather from the ground and shows it."
12
13 def in_the_forest(duck):
14     duck.quack()
15     duck.feathers()
16
17 def game():
18     donald = Duck()
19     john = Person()
20     in_the_forest(donald)
21     in_the_forest(john)
22
23 game()

这个例子中,可以看出来,人不是鸭子,但是一旦拥有的鸭子的一些方法,就可以被当成--鸭子类型。

"在Python中,鸭子类型的最典型例子就是类似file的类。这些类可以实现file的一些或全部方法,并可以用于file通常使用的地方。" 但是一旦一个类不具有鸭子的方法,大概是要出错的。如:

 1 class Duck:
 2     def quack(self):
 3         print "Quaaaaack..."
 4     def feathers(self):
 5         print "The Duck has feathers."
 6
 7 class Person:
 8     def quack(self):
 9         print "Person is not a duck"
10     def feathers(self):
11         print "The person takes a feather from the ground and shows it."
12
13 class Car:
14     def run(self):
15         print "Car is running"
16
17 def in_the_forest(duck):
18     duck.quack()
19     duck.feathers()
20
21 def game():
22     donald = Duck()
23     john = Person()
24     in_the_forest(donald)
25     in_the_forest(john)
26     car = Car()
27     try: # will throw exception
28         in_the_forest(car)
29     except (AttributeError, TypeError):
30         print "No the method for duck typing"
31
32 game()
33     

"在更实际的实现类似file的行为的例子中,人们更倾向于使用Python的异常处理机制来处理各种各样的可能因为各种程序员无法控制的环境和operating system问题而发生的I/O错误。在这里,“鸭子类型”产生的异常可以在它们自己的子句中捕获,与操作系统、I/O和其他可能的错误分别处理,从而避开复杂的检测和错误检查逻辑。"

个人认为:鸭子类型也许能够避免一些类的重写,无需大量复制相同的代码,但是需要良好的文档支持,不然会让代码变得很混乱,谁知道你的鸭子是不是我的鹅呢?哈哈

来自维基百科: 鸭子类型

转载于:https://www.cnblogs.com/jaw-crusher/p/3475868.html

[转]编程语言中的 鸭子模型(duck typing)相关推荐

  1. duck typing java_编程语言中的鸭子类型 Duck Typing

    来源 | https://segmentfault.com/a/1190000019607240 1.什么是鸭子类型(duck typing) 百度百科是这样解释的: 这是程序设计中的一种类型推断风格 ...

  2. 编程语言中的鸭子类型 Duck Typing

    来源 | https://segmentfault.com/a/1190000019607240 1.什么是鸭子类型(duck typing) 百度百科是这样解释的: 这是程序设计中的一种类型推断风格 ...

  3. 【Python】浅谈 鸭子类型 (Duck Typing)

    目录 一.来源 二.说明 三.举例 四.不足 一.来源 在程序设计中,鸭子类型 (duck typing) 是动态类型的一种风格.在此风格中,一个对象有效的语义,不是由继承自特定的类或实现特定的接口, ...

  4. Python编程基础:第四十九节 鸭子类型Duck Typing

    第四十九节 鸭子类型Duck Typing 前言 实践 前言 本节我们一起学习一个非常有趣的知识点:鸭子类型.有这么一句话:If it walks like a duck, and it quacks ...

  5. Python笔记 · 鸭子类型 / Duck Typing

    1. 问题的由来 我初次意识到鸭子类型的存在是在学习Sklearn时,在<Hands-On Machine Learing>一书的第二章,作者提供了一个自定义的Tansformer,使用自 ...

  6. python中的鸭子模型

    python中没有多态,也用不着多态,python崇尚"鸭子模型" 在程序设计中,鸭子类型(英语:duck typing)是动态类型的一种风格.在这种风格中,一个对象有效的语义,不 ...

  7. 鸭子类型duck typing(动态)

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

  8. duck java_编程语言中的 DUCK TYPING

    如果一只动物走起来像鸭子.游泳起来像鸭子.叫起来也像鸭子,那么这只动物就可以被称为鸭子. 许多编程语言都支持 Duck Typing ,通常 Duck Typing 是动态编程语言用来实现多态的一种方 ...

  9. 编程语言中的 DUCK TYPING|python、c++、java、go

    如果一只动物走起来像鸭子.游泳起来像鸭子.叫起来也像鸭子,那么这只动物就可以被称为鸭子. 许多编程语言都支持 Duck Typing ,通常 Duck Typing 是动态编程语言用来实现多态的一种方 ...

最新文章

  1. 大作文十大必背范文:五星级真题
  2. 残差网络(ResNet)
  3. Jquery Money 验证,转换成千分位
  4. 【clickhouse】Clickhouse 版本号历史
  5. mysql连接被拒绝 密码也对_解决Mysql数据库拒绝远程连接和忘记密码的问题
  6. convert转换虚拟机注意事项及相关经验介绍
  7. sleep方法和wait方法的区别?
  8. 惠普打印机换硒鼓图解_惠普打印机墨盒更换步骤
  9. 黄绿色——三色配色篇
  10. alc662声卡注入id_使用Clover 开启ALC662声卡原生AppleHDA驱动
  11. 基于Python的家谱信息管理系统
  12. 计算机推免资源(不定期更新)
  13. java 视频边下边播_video src,如何边加载边播放?
  14. 《高绩效成果教练》课程笔记及思考
  15. 通过465端口发送邮件
  16. Kanzi: kanzi 学习:kanzi触发器参考
  17. 纸小墨ink简洁主题story爱上你的故事
  18. python实现井字棋
  19. DDD:领域驱动设计
  20. premiere中为PNG去掉黑底加logo

热门文章

  1. ORA-01109:数据库无法启动问题
  2. u-boot2013.10引导linux3.10.30记录
  3. 科幻画图片大全浇水机器人_从机器人到智能机器人,谭建荣院士为温肯师生揭秘新科技...
  4. write up:杂项 又一张图片,还单纯吗 --图片提取
  5. 北京协和医学院823计算机原理,2017年北京协和医学院放射医学研究所(天津)823计算机原理考研题库...
  6. 对话李飞飞,展望阿里云与MongoDB战略合作未来
  7. Flink 在有赞的实践和应用
  8. 基于动态背包的多场景广告序列投放算法
  9. 确保您的物联网部署具备5G功能
  10. 微云存照片会变模糊吗_QQ相册里的照片,为什么放一段时间就会变模糊?今天可算知道了...