#百度百科鸭子类型定义

这是程序设计中的一种类型推断风格,这种风格适用于动态语言(比如PHP、Python、Ruby、Typescript、Perl、Objective-C、Lua、Julia、JavaScript、Java、Groovy、C#等)和某些静态语言(比如Golang,一般来说,静态类型语言在编译时便已确定了变量的类型,但是Golang的实现是:在编译时推断变量的类型),支持"鸭子类型"的语言的解释器/编译器将会在解析(Parse)或编译时,推断对象的类型。

这个解释很抽象,又拗口,最讨厌看这些解释了

#容易看懂的定义

其实动态语言是相对静态语言而言的,静态语言的特点是在程序执行前,代码编译时从代码中就可以知道一切,比如变量的类型,方法的返回值类型:

String s = "hello"

s = "world"

s = 1// 编译时就会报错

在静态语言中,变量有类型信息,它是一块内存区域,静态语言的优点是代码结构非常规范,便于调试,但有时显得啰嗦。

而动态语言只有等到程序运行时才知道一切,变量(严格来说叫名字,就像人的名字一样)不需要指定类型,变量本身没有任何类型信息,类型信息在对象身上,对象是什么类型,必须等到程序运行时才知道,动态类型语言的优点在于方便阅读,不需要写很多类型相关的代码;缺点是不方便调试,命名不规范时会造成读不懂,不利于理解等。

s = "hello"

s = "world"

s = 1# 可以给变量随意赋值,无论是什么类型都可以鸭子类型

动态语言中经常提到鸭子类型,所谓鸭子类型就是:如果走起路来像鸭子,叫起来也像鸭子,那么它就是鸭子(If it walks like a duck and quacks like a duck, it must be a duck)。鸭子类型是编程语言中动态类型语言中的一种设计风格,一个对象的特征不是由父类决定,而是通过对象的方法决定的。

#看个例子

这里面

鸭子自然会嘎嘎的叫

小鸟也会叫,这鸟叫声跟鸭子叫声很类似, 哇哇啾啾

小狗也会叫,这狗叫声跟鸭子叫声也很类似,哇哇

既然叫声都很类似,那就认为它们都是鸭子,直接指鸟为鸭,指狗为鸭,

我们并不关心对象是什么类型,到底是不是鸭子,只关心行为。

#小扩展

如果你学的是Java或者C++等静态语言,可能对鸭子类型的理解没那么深刻,因为静态语言中对象的特性取决于其父类。

而动态语言则不一样,比如迭代器,任何实现了 __iter__ 和 __next__ 方法的对象都可称之为迭代器,但对象本身是什么类型不受限制,可以自定义为任何类

鸭子类型依赖文档、清晰的代码和测试来确保正确使用 。这既是优点也是缺点,缺点是需要通过文档才能知道参数类型,为了弥补这方面的不足,Python3.6 引入了类型信息,定义变量的时候可以指定类型

#参考

https://www.sohu.com/a/169574908_776230

https://blog.csdn.net/IAlexanderI/article/details/80266300

最新文章

  1. 无法识别的属性“targetFramework
  2. Hive UDF’S addMonths
  3. PAT乙级 1010. 一元多项式求导 (25)
  4. springmvc 传递对象数组参数 property path is neither an array nor a List nor a Map
  5. C#:ref和out的联系及区别
  6. Why SignalR does not use WebSockets?
  7. JavaWeb之Servlet总结
  8. ASP.NET Core - 开篇
  9. C#代码安装Windows服务(控制台应用集成Windows服务)
  10. 简单文本悬浮div提示效果
  11. 我的 FPGA 学习历程(13)—— 电子钟项目
  12. mybatis学习系列一
  13. F#周报2018年第49期
  14. common mistake of closure in loops
  15. 【SVN】Linux下svn搭建配置全过程——初学者轻松上手篇
  16. Android Device Monitor工具的使用
  17. selenium 定制启动 chrome 的选项
  18. 部署openfire到linux环境下
  19. CF1142E/1143B Lynyrd Skynyrd
  20. 剑指offer二十二之从上往下打印二叉树

热门文章

  1. linux 利用LDAP身份集中认证
  2. Spring -10 -<bean>的 scope 属性 -singleton 默认值/prototype 多例 /request /session /application /global session
  3. Keras神经网络data generators解决数据内存
  4. docker创建Webvirtmgr容器
  5. 基于 Redis 实现简单的分布式锁
  6. Idea和eclipse安装activiti插件
  7. ES基本搜索(1)
  8. Python中对列表排序实例
  9. javaweb学习笔记(二)
  10. YAML_07 有报错信息,告诉你错误忽略,继续执行下面的命令